Linux #21
사용자 패스워드에서 Linux 디폴트 해시 알고리즘인 SHA512와 MD5의 해시 길이는 다르다.
tester1:$6$eKBZx/NPgmr/8xv$wOHqCx08VWjbLCHCusEtSSDCcPNfDPRhOc11BPlynb2i5OL6tTDCbp4/Nt.PLmvCMk/EFhv5YfYizGiGgY/9J.:19389:0:99999:7:::
tester2:$1$oT5kl/Fu$ZQvmoHE8J8ba32ThKMice1:19389:0:99999:7:::
=>위의 내용은 tester1(user_name):$6$(hash_algorithm),
$eKBZx/NPgmr/8xv$(salt),
$wOHqCx08VWjbLCHCusEtSSDCcPNfDPRhOc11BPlynb2i5OL6tTDCbp4/Nt.PLmvCMk/EFhv5YfYizGiGgY/9J.(hashed_password)
http://www.passwordmeter.com에서 패스워드의 세기를 알 수 있다.
https://www.virustotal.com에서 악성코드의 세기를 알 수 있다.
https://www.tinyurl.com OR https://bitly.com 사이트에서 퓌싱 사이트 등의 악성 사이트 주소를 변경해서 사용할 수 있다.
http://www.ruu.kr OR https://www.mailinator.com 사이트는 사전 계정 등록 없이 사용할 수 있는 Disposable Mail Box이다.
SSL 인증에 더해서 .htpasswd와 .htaccess 파일로 웹 디렉터리 접근 제한하기
앞에서 SSL 인증서 접속에서 .htpasswd 파일을 사용해서 웹상의 특정 디렉터리나 웹 페이지(/var/www/html/index.html)의 접속을 제한하려면 var/www/html/.htpasswd/index.html식으로 해두면 .htpasswd를 거쳐야 웹 페이지 파일인 index.html에 가게 해서 사용자들을 걸러낼 수 있다는 것을 알아보았다. 여기에 더해서 웹에 저장된 파일 등의 접근을 제어하려면 .htpasswd에 .htaccess도 함께 적용시켜주면 더욱 보안이 좋아진다. 하지만 .htaccess는 시스템 성능저하를 가져올 수 있으므로 가급적 함께 사용하지 않는 것이 좋다.
iptables로 방화벽 설정하기
이상적으로 CentOS 서버에서 실행되고 있는 모든 서비스는 별도로 보안 어플이나 설정을 추가적으로 해주지 않아도 디폴트로 내장되어 있는 접근통제 설정으로 네트워크로부터 안전하도록 설계되어 있다. 하지만 원치 않는 외부 사용자의 접속과 DDoS와 같은 공격으로부터 시스템은 현실적으로 안전하지 않다. 네트워크 보안의 목적은 오직 권한 있는 사용자들만 서버 서비스에 접속해서 허용된 범위 내에서 서비스를 이용하게 하는 것이다.
내부 네트워크든 외부 네트워크든 인터넷에 연결된 어느 호스트라도 해커의 침투머신이 될 수 있다. 내부 로컬 네트워크에서도 소셜 엔지니어링(Social Engineering) 등으로 침투해 들어올 수 있으므로 내부 네트워크도 위협이 될 수 있어서 관리상 간과해서는 안 된다.
해커는 외부 네트워크를 통해서 방화벽을 뚫고 시스템에 로그인할 권한을 얻으려고 애쓰는 사람이지만 내부인은 로컬 랜을 통해서 자신에게 허가되지 않은 서비스에 접근하려는 사용자로, 예를 들어서 월급명세서가 저장되어 있는 경리과 파일서버에 어느 영업부 직원이 접속하려고 시도하는 경우이다. 따라서 민감한 정보를 서버에 저장하고 있다면 로컬 사용자들도 접근하지 못하게 해 두어야 하는데, 이 경우 경리과 파일서버에 접근권한이 없는 이들을 막기 위해서 방화벽을 걸어 두어야 한다. 그리고 중요한 작업을 자주 수행하고 중요한 설정들이 저장되어 있는 IT 부서의 직원용 호스트에는 내부는 물론이고 원격에서도 접근도 제한시켜 두는 것이 필요하다. Network에서 라우터에 설정하는 ACL(Access Control List)과 유사한 개념으로 이해하면 된다.
iptables에서 사용되는 용어 정리
용어 설명
policy 패킷에게 적용되는 룰 정책이다.
tables filter(걸러줌), nat(주소전환), mangle(섞임), raw(순수형태)가 있는데 iptables에서는 주로 filter를 사용하고 INPUT(들어옴), OUTPUT(나감), FORWARD(전달) 체인을 가진다.
iptables -t filter --list 해본다.
chain 일단의 룰을 말하는데 하나의 체인에 여러 룰이 한 줄에 하나씩 들어있다.
match 룰에서의 각 조건을 말하는데 --source(-s 출발지), --destination(-d 목적지), --protocol(-p프로토콜), --in-interface(-i 입력_인터페이스), --out-interface(-o 출력_인터페이스), --state(상태), --jump(-j 점프), --match(-m 매치), --syn(-y 동기화), --frag(-f 단편화), --dport(목적지_포트), --sport(출발지_포트), --mode(-m 모드), ... 등이 있다.
stateful 적용할 서비스에 대한 상태로써 NEW(새로 연결), ESTABLISHED(기존 연결), RELATED(관련된 연결), 그리고 INVALID(무효 연결) 등이 있다. 이들을 여럿 써줄 때, 뒤에 빈칸 없이 이어서 써준다.
target 룰과 일치할 때의 행동으로 ACCEPT(받아줌), DROP(로그파일 없이 버림), REJECT(로그파일 남기고 버림), LOG(로그로 기록함), RETURN(송신자에게 되돌려 보냄), QUEUE(대기열에 저장함) 등이 있다.
이외에도 PREROUTING(먼저 룰을 적용한 뒤 실행함), POSTROUTING(먼저 실행한 뒤 룰을 적용함)도 있고, 규칙(룰)에 따른 행동으로 ACCEPT, DROP, REJECT 이외에 NAT에서 사용하는 MASQUERADE(나가는 패킷의 출발지 주소와 포트변환), SNAT(나가는 패킷의 출발지 주소변환), DNAT(들어오는 패킷의 목적지 주소변환), 그리고 LOG(로그 기록) 옵션이 있다.
CentOS에서 방화벽 설정은
1) firewall-cmd --permanent --zone=public --add-port=80/tcp 식으로 해준 다음, firewall-cmd --reload 하거나, firewall-fonfig 해서 설정한다.
2) iptables -A INPUT -p tcp --dport 22 -j REJECT 식으로 설정하거나
3) yum -y install iptables-services 하고
nano /etc/sysconfig/ipatables하고 파일에 직접 적어도 된다.
iptables 룰 생성 규칙
네트워크 인터페이스를 통해서 들어온 패킷은 서버의 커널을 거쳐 로컬 프로세스에게 전달된다. Linux에서 들어오는 패킷을 자체적으로 필터링(걸러줌)하는 기능이 바로 iptables(IPv6는 ip6tables)이다. iptables는 Linux kernel 2.4까지 사용되던 ipchains를 대신해서 방화벽 설정에서 사용되는데 원리는 인터페이스로 들어오는 패킷의 헤더 정보를 보고 DROP(송신자에게 에러 메시지를 안 보내고 버림), REJECT(송신자에게 에러 메시지를 보내고 버림), FORWARD(다른 곳으로 전송함) 중 하나의 행동(action)을 수행하게 한다.
∎ 외부에서 시스템으로 패킷 A가 들어오면
① 먼저 패킷 A 헤더에서 목적지 주소를 확인하는 라우팅(routing) 과정을 거친 뒤,
② 패킷 A의 목적지가 이 시스템이면 패킷을 ACCEPT하고 INPUT 체인으로 보내서 CPU가 처리하게 하고, 정책상 패킷 A를 처리할 수 없게 되어 있으면 해당 패킷을 REJECT하거나 DROP시킨다.
③ 목적지가 다른 네트워크나 시스템이라면 FORWARD 체인이 설정되어 있을 때 패킷 A를 해당 목적지로 보낸다.
∎ 반대로 내부 시스템에서 패킷 B를 외부로 전송한다면
① 먼저 OUTPUT 체인으로 패킷 B를 보내고,
② 라우터나 스위치가 패킷 B를 받아서 FORWARD 체인을 통해서 원하는 목적지로 라우팅 과정을 거쳐서 내보낸다.
체인 룰(엔트리)에 대한 조작
체인 종류 설명
A(ppend) 추가로써 해당 체인의 룰에서 맨 끝에 자리한다.
I(nsert) 끼워 넣기로써 체인의 시작이나 어느 포인트에도 자리할 수 있는데 '-I 체인_룰_번호'식으로 지정해서 어느 곳이라도 위치시킬 수 있다. 대부분 체인의 시작에 룰을 둘 때 사용된다. 룰 1뒤에 -I INPUT 2 ~ 식으로 넣으면 이후의 룰은 번호가 하나씩 밀리게 된다.
R(eplace) 대체로써 '-R 체인_룰_번호'식으로 사용하면 해당 룰이 새로운 룰로 대체된다.
D(elete) 삭제인데, 그냥 -D를 사용하면 매치되는 첫 번째 룰을 삭제하고, '-D 체인 룰_번호'식으로 해주면 해당 룰만 삭제한다.
옵션 -C(체인 규칙확인), -L(체인 규칙보기), -F(지정한 체인내의 모든 규칙제거), -N(사용자_정의 체인생성), -X(사용자_정의 체인삭제), -P(지정한 체인정책 변경), --line-numbers(체인 룰에 줄번호 매기기) 등이 있다.
룰의 기본구조는
iptables -A INPUT -p tcp –m multiport --dports 80,443(OR 20:100) -i eth0 -s 192.168.100.0/24(OR 192.168.100.100) -d 10.10.10.0/24(OR 10.10.10.10) -m state --state NEW,ESTABLISHED -j ACCEPT식이다.
--state NEW,RELATED 등을 사용하려면 앞에 -m state도 함께 있어야 하고,
여러 포트를 한 번에 주려면 앞에 -m multiport가 --dports 앞에 있어야 한다.
여러 포트는 80,443 하면 80과 443 포트가 되고, 20:100 하면 20~100번까지 포트에 해당된다.
혹은
iptables -A INPUT -p tcp --dport 22 -j REJECT식으로 간단하게 할 수도 있다.
∎ 체인 규칙은
1) 체인에 있는 룰(각각을 엔트리라고 부름)은 처음부터 순차적으로 내려가면서 검사되고,
2) 매치되는 룰을 만나면 그곳에서 더 이상 아래로 내려가지 않고 체인을 벗어나서 타겟에게 지정한 액션을 적용시킨다.
3) 추가(-A INPUT ~ ) 하면 맨 아래에 저장된다.
4) 변경한다면 -I INPUT 2 ~식으로 두 번째 엔트리로 만들 수 있다.
5) 교체한다면 -R INPUT 3 ~식으로 세 번째 엔트리를 바꿀 수 있다.
6) 모든 체인의 끝에는 암묵적(implicity)으로 deny가 있다!!! 따라서 위에서 풀어줄 것을 풀어주지 않으면 나중에는 모두 거부되게 된다. 이것은 마치 tcp_wrapper(/etc/hosts.allow, /etc/hosts.deny)에서 프로세스가 먼저 /etc/hosts.allow를 먼저 보고 나중에 /etc/hosts.deny 파일은 보고 처리해주는 것과 유사한 메카니즘이다.
7) 체인을 저장한다면 iptables-save > /etc/iptables.ori식으로 해주고
체인을 복원한다면 iptables-restore < /etc/iptables.ori식으로 해주면 된다.
8) 조직에서 필요로 하는 하나의 iptables 정책 파일을 생성한 뒤 다른 시스템에 적용할 수 있는데, 마치 하나의 라우터에서 ACL을 작성한 뒤, 다른 라우터에 적용할 수 있는 것과 유사한 매카니즘이다.
iptables 설정 시
∎ 주소는 소스(-s)와 목적지(-d)에 www.kahn.edu,127.0.0.1,192.168.100.0/24식으로 ,를 사용해서 나열하거나 192.168.100.0/255.255.255.0식으로 IP 주소를 써줘도 된다.
∎ kahn.edu식으로 도메인을 지정하려면 /etc/hosts 파일에 미리
192.168.111.149 www.kahn.edu www kahn.edu식으로 설정되어 있어야 가능하다.
∎ 포트는 해당 서비스의 특정 포트를 써주면 되는데
a. cat /etc/services |more 해서 확인한 다음
b. --sport 23이나 --dport 21식으로 단일 포트를 지정하거나,
c. -m multiport --dports 21:80같이 21~80 포트 범위나
d. -m multiport —dports 20,21 같이 포트를 ,로 나열하거나, 이들을 합해서
e. —dports 20,22:80(20, 22, 23~80 연속)식으로 지정할 수 있다. 또
f. ! --dport 23 -j ACCEPT식으로 해서 특정 23 포트를 제외시킬 수도 있다. ! 뒤에 빈 칸이 있다.
g. -m mac —mac-source 00:0C:29:A4:32:0A # 출발지 MAC 주소가 00:0C:29:A4:32:0A인 호스트
를 써주면 된다.
◾ iptables의 룰은 위부터 아래로 차례로 적용되므로 순서가 중요한데, 보통
1) 먼저 허가 룰을 지정하고 나중에 거부 룰을 지정하며,
2) 디폴트 기본 룰을 버리고, 사용자_지정 룰을 별도로 생성해서 사용한다.
3) 하나의 호스트에서 지정한 룰을 다른 호스트에 복사해서 적용시킬 수 있다.
웹 서버가 공격받고 있다면
ipatables -I INPUT 1 -p tcp -dport 80,443 -j DROP
DDos 공격인 Syn Flooding과 Smurf 공격을 받고 있다면
iptables -I INPUT 1 -p tcp --tcp-flags SYN,RST SYN -j DROP
iptables -I INPUT 2 -p tcp --tcp-flags ALL SYN,FIN -j DROP
=>iptables -I INPUT 2 -p tcp --syn -j DROP 해도 된다.
->TCP 패킷의 헤더에는 RST, SYN, URG, ... 등의 6개의 flags가 있다.
DoS 공격
DoS 공격은 특정 서버의 특정 서비스에 대해서 무차별적으로 연결 패킷만 보내는 공격을 말한다.
① 웹 서버에 1초에 100번 이상 HTTP 요청이 들어온다면 DoS 공격일 가능성이 크다.
=>이런 SYN 패킷을 다음처럼 막아두어야 한다.
iptables –I INPUT 2 –m state --state NEW,RELATED –p tcp --dport 80 –j ACCEPT 해서 80번 웹 서버로 향하는 일반 요청은 허락하고,
② 초당 50번 이상의 80번 포트로 연결요청을 해오는 패킷을 버린다면
iptables -I INPUT 3 -p tcp --dport 80 -m limit --limit 50/s –j DROP 해준다.
③ 웹 서버에 분당 1,000개의 연결요청이 있고 이중 50개가 일시에 연결되고 있다면, 이 50여개 중 일부는 송수신 주소나 패킷 길이 이상 등으로 연결되지 못했을 수도 있지만 이런 패킷도 역시 DoS 공격일 가능성이 있다.
iptables -I INPUT 3 -p tcp --dport 80 -m limit --limit 1000/m --limit-burst 50 -j DROP 해주면 된다.
=>Ubuntu에서의 ufw 기본설정은
ufw deny from 10.10.10.10 to any port 22 proto tcp 식이다.
allow, deny, reject, limit, delete, 그리고 insert 명령어를 사용할 수 있다. from ~ 은 출발지, to ~ 는 목적지, any는 '어느 ~ 라도'의 의미이다.