시스템 보안 및 관리
시스템 보안 관리
1) 리눅스 보안의 소개
- 웹서버의 전체 중 약 70% 차지
- 오픈소스 소프트웨어이기 때문에 보안에 취약하다는 지적이 있었지만 위협에 대응해 지속적으로 패치를 만들고 업데이트 .
2) 물리적 보안
1. 물리적 보안의 설명
기본적으로 보안에 민감한 서버에 대해 허가받지 않은 사용자가 물리적으로 접근하지 못하게 하는것.
2. 물리적 보안 방안
cctv, 동작감지 열화상카메라, 자동잠김 강화도어 등.
3) 시스템 보안
1. BIOS 보안
BIOS 설정을 변경해 부팅하여 리눅스의 복구모드로 진입 가능하므로 BIOS에 비밀번호를 설정.
2. 패스워드 보안
- root 사용자는 허가되고 제한된 사용자에게만 부여.
UID가 0이면 root 사용자의 권한을 갖기 때문에 /etc/password 파일 중 UID가 0인 사용자가 있는지 점검
$cat /etc/passwd |grep x:0: root:x:0:0:root:/root:/bin/bash |
- root 사용자만 읽을 수 있는 SHA512로 해시를 만들어내는 /etc/shadow를 사용하는 것이 안전.
- 무작위 대입 공격을 방어하려면 강력한 패스워드를 설정해야 하는데 PAM 중 pam_cracklib.so를 사용할 수 있다.
- 사용자가 패스워드를 정기적으로 변경하도록 chage 명령어나 User Manager 어플리케이션 사용.
특정 사용자 패스워드 만료일을 90로 설정
$charge -M 90 <username>
3. 관리자 계정 보안
- root 사용자의 로그인은 제한하고 su 또는 sudo 명령어를 통해 필요할 때 일시적으로 관리자 권한을 부여
로그인 제한을 위해 /etc/passwd 파일의 root 사용자의 셸 설정을 /sbin/nologin으로 변경
- SSH 프로토콜을 통한 root 사용자 로그인을 막기위해 /etc/ssh/sshd_config 파일에서 PermitRootLogin no를 기입
4) 서비스 및 운영 보안
1. 필수 서비스만 사용
사용하지 않는 서비스나 응용프로그램은 보안의 취약점이 될 수 있으므로 사용하는 서비스만 남기고 삭제.
2. 시스템 정보 숨김
로그인할 때 /etc/issue 또는 /etc/issue.net의 내용이 사용자 터미널에 출력되므로, 보안상 해당 파일을 수정.
3. 부트로더 패스워드 설정
root 패스워드 분실시 복구모드로 진입하거나 단일 사용자 모드로 부팅하여 root의 패스워드 변경.
이를 방시하기위해 부트로더에 패스워드 설정한다.
grub 에 패스워드를 설정하기위해 grub-crypt 명령어를 사용
$grub-crypt
4. 보안 서비스 사용
원격 터미널 접속을 위해 telnet 보다는 ssh를 사용
telnet은 암호화되어 있지 않은 평문으로 패킷을 주고받기 때문에 tcpdump, wireshark와 같은 패킷 캡쳐 도구를 통해 사용자 정보가 노출될 수 있다.
5) 파일 시스템 보안
1. 소유권과 허가권
파일 및 디렉터리의 소유권 및 허가권을 필요한 만큼만 설정.
다른 사용자의 허가권을 rwx로 부여하는것은 위험하다.
사용자에게 임시로 root 권한을 줄 수 있는 Set-UID, Set-GID, Sticky-Bit 와 같은 특수권한의 사용은 관리되어야 함.
2. lsattr
파일의 속성을 출력. 파일의 속성은 파일 허가권과 동일 의미는 아님.
lsattr [option] file
3. chattr
파일의 속성을 수정하는 명령어
chattr [option] mode file
4. getfacl
파일의 ACL(access control list)을 확인하는 명령어.
파일의 이름, 소유자, 그룹과 ACL 정보를 함께 출력.
gerfacl [option] file or directory
5. setfacl
- 파일이나 디렉터리에 ACL을 설정하는 명령어
- 리눅스의 기본허가권은 파일에 대한 소유자, 그룹, 다른사용자의 허가권만 지정할 수 있을뿐 특정 사용자마다 허가권을 세밀하게 권한을 부여할수 없음. 이러하나 제약을 극복하고 각 파일이나 디렉터리의 접근에 대한 세밀한 권한을 부여하는 보안 통제방식
- access ACL과 기본 ACL 두가지 종류
- access ACL은 지정한 파일이나 디렉터리에 설정한 임의의 ACL 의미
- 기본 ACL은 필수는 아니지만 디렉터리에 설정가능.
- 기본 ACL이 설정된 디렉터리에 access ACL이 지정되지 않은 파일이 생성된다면 해당 파일은 디렉터리의 기본 ACL 사용.
setfacl [option] file or derectory
6) 네트워크 보안
1. sysctl 을 통한 보안 강화
/proc/sys 디렉터리 이하의 커널 매개변수는 확인하거나 설정하는 명령어로서 세부커널 설정을 통해 리눅스 보안강화할 수 있다.
/proc/sys/net 이하에는 네트워트 관련 커널 설정을 할 수 있는 경로.
sysctl [option] variable[=value]
systemstl을 통한 보안 강화 예시
보안 위협 | 조치방법 |
서버 날짜 정보 유출 | /proc/sys/net/ipv4/tcp_timestamps를 0으로 설정하여 외부에서 서버의 날짜 정보를 확인할 수 없도록 한다. |
SYN_FLOODING 공격 | - TCP 연결설정의 특성(3-way handshake)을 이용한 공격. 클라이언트는 서버에 연결하기 위해 SYN 패킷을 전송하고 서버는 SYN,ACK 패킷을 응답하고 클라이언트의 ACK 응답을 최종적으로 기다림. 이때 백로그 큐에 연결정보를 저장하는데, 이러한 ACK 응답없는 연결이 누적되면 백로그 큐가 가득차서 더이상 서버가 연결을 받을수 없는 상태가 된다. - /proc/sys/net/ipv4/tcp_syncookies를 1로 설정해 TCP 세션 연결시 ACK 패킷이 오지 않을때 백로그 큐를 낭비하지 않도록 한다. - 또는 /proc/sys/net/ipv4/tcp_max_syn_backlog 의 크기를 늘려줘서 백로그 큐가 가득 차지 않도록 함. |
ping 차단 | - ping은 서버가 동작중인지 확인하여 해킹을 위한 기본 단서가 되는 정보가 됨. - /proc/sys/net/ipv4/icmp_echo_ignore_all 의 값을 0으로 바꿔 ping에 대한 응답을 주지 않을 수 있음. |
스머프 공격 | - IP 브로드캐스트 주소를 통해 네트워크로 ICMP 패킷을 전송하는 분산 서비스 거부공격. - /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts 를 0으로 설정해 예방 |
과다 세션 공격 | - 세션을 수십만개를 만들어 서버가 더이상 동작하기 어려운 상황을 만들수 있는데, 이를 예방하기위해 세션 종료시간을 짮게 설정. - /proc/sys/net/ipv4/tcp_fin_timeout 에 원하는 만료시간(초단위) 설정. |
tcp keepalive time 설정 | /proc/sys/net/ipv4/tcp_keepalive_time의 값을 초단위로 변경하여 시스템 자원낭비 예방 |
로컬 포트 사용범위 설정 | /proc/sys/net/ipv4/ip_local_port_range를 변경하여 서버가 실제 사용하는 포트의 범위를 설정하여 실제 악성코드가 포트를 점유할 가능성 줄임. |
IP 포워딩 기능 제한 | - 라우터가 아닌 서버가 IP포워딩 기능을 갖는것은 보안츼 취약점이 될 수 있음. - /proc/sys/net/ipv4/ip_forward를 0으로 변경하여 취약점 예방. |
SELinux(Security-Enhanced Linux)
1) SELinux 의 개요
1. 필요성
- root 권한 취약점에 대한 리포트를 모니터링하고 패치를 적용하려는 노력 해야함
- root 권한으로 실행하는 데몬을 최소로 유지해야 하지만 포트번호 1024이하의 잘 알려진 포트의 경우 root만 사용할 수 있음.
root권한이라 하더라도 미리 지정한 권한으로 리소스를 접근 가능하게 하는 강제 접근 제어가 가능.
2. 정의
- 미국 NSA National Security Agency 에 의해 연구된 프로젝트, 강제 접근제어 MAC: Mandatory Access Control 와 같은 접근제어 정책을 제공하는 리눅스 커널 보안 모듈
- MAC은 모든 주체와 객체에 대해 국부적으로 허가하는 접근제어 정책.
모든 접근은 불가이며, 정책에 따라 필요한 기능에 대해서만 사용권한을 안전하게 부여하는 것.
3. 특징
- 리눅스 커널의 기본 기능으로 일반적인 리눅스 배포판을 사용하면 기본으로 포함.
- 리눅스 배포판에는 이미 사전에 잘 정의된 정책이 탑재
- 제로데이공격으로 시스템이 공격을 받더라도 피해를 최소화
2) SELinux의 설정 및 해제
1. SELinux의 동작 모드
레드햇 CentOS는 기본으로 enforce mode로 동작하고 정책에 어긋나는 동작은 거부
enforce | SELinux의 정책을 적용한 상태 정책을 위반하는 동작은 차단 |
permissive | 정책 위반행위가 차단되지는 않지만 로그는 남겨짐. 처음 SELinux를 도입할 때 permissivea 모드에서 위반 동작을 해결하고 단계적으로 enforce 모드로 넘어가는것도 좋음. |
disable | 정책 적용을 비활성화 |
2. SELinux의 모드 확인하기
- sestatus 명령어로 모드 확인
- setenforce 명령어로 enforce 모드로 변경가능
- /etc/sysconfig/selinux 파일에 SELINUX 변수의 값을 수정하여 영구 반영.
시스템 보안 유틸리티
1) ssl(Secure Shell)
1. ssh의 정의
원격의 서버나 시스템에 안전하게 연결하기 위한 프로토콜
호스트와 클라이언트 간의 패킷을 암호화하여 주고 받음으로써 보안에 강함.
포트번호는 22번
2. ssh 연결 준비사항
레드햇에서는 openssh-clients 패키지를 통하여 ssh 클라이언트를 설치
$sudo yum install -y openssh-clients |
원격 컴퓨터에는 ssh 서버를 설치하고 실행중이어야 하고, IP 주소 또는 도메인명을 제공해야 함.
3. ssh 서버의 설치
- openssh-server 패키지를 설치
$sudo yum install -y openssh-server - sshd 서비스를 시작
$sudo server sshd start - 부팅할 때 자동으로 sshd 데몬을 시작하려면 다음과 같이 환경설정을 추가
$sudo chkconfig sshd --add
$sudo chkconfig sshd on --level 2,3,4,5
4. 비밀번호 인증을 통한 ssh 서버 접속
- openssh-clients 패키지를 설치하면 ssh 명령어를 사용.
-l 옵션을 사용해 로그인 사용할 계정을 입력하고 원격지의 IP주소를 입력하면 ssh연결을 간단히 할 수 있음.
$ssh -l francis 192.168.100.100 - 현재 로그인한 계정과 동일한 계정으로 ssh에 접속하려면 간단히 IP 주소만 입력해도 됨.
$ssh 127.0.0.1 - ssh 포트번호가 1800dlfkaus -p 옵션을 사용해 포트번호를 변경하여 접속
$ssh -p 1800 francis@192.168.100.100
5. 인증키를 통한 ssh 자동 접속
- ssh-keygen 명령어로 비밀키와 공개키를 생성하고 공개키를 원격서버에 복사해두면 비밀번호 입력없이 ssh 접속이 가능.
- -t 옵션을 통해 알고리즘을 결정할 수 있는 dsa 또는 rsa등을 지정
$ssh-keygen -t dsa - 홈디렉터리의 .ssh디렉터리에 비밀키인 id_dsa와 공개키인 id_dsa.pub 생성됨
- ssh서버에 .ssh 디렉터리를 생성한다
$ssh 192.168.100.100 mkdir .ssh - scp명령어를 사용해 .ssh 디렉터리의 id_dsa.pub을 authorized_keys 이름으로 복사
$scp id_dsa.pub 192.168.100.100:.ssh/authorized_keys - ssh접속을 위한 준비는 모두 끝났고 비밀번호 없이 자동으로 접속
$ssh 192.168.100.100
6. sshd 환경설정
sshd 데몬의 환경설정은 /etc/ssh/sshd_config 에서 수행.
데몬스크립트의 위치는 /etc/rc.d/init.d/sshd
sshd 데몬의 주요 환경설정 항목
Port | ssh가 사용하는 포트. 기본값 22 |
PermitRootLogin | yes로 설정하면 ssh root@localhost와 같이 root 로 로그인 가능 |
AllowUsers | 허용된 사용자만 ssh 접속이 가능하도록 함. 모두 사용 가능하게 하려면 공백으로 두고 특정 사용자로 지정하려면 - AllowUsers francis chris - francis chris 사용자만 ssh 접속 가능 |
LoginGraceTime | 사용자의 로그인을 기다리기 위한 대기시간 보통 2m로 설정하는데 무차별 대입 공격을 막기위해 더 짧게 설정하면 안전 |
PasswordAuthentication | 비밀번호 인증을 통한 접속 활성화 여부를 설정 공개키 인증을 사용하지 않는다면 반드시 yes 로 설정 |
PubkeyAuthentication | 보안강화를 위해 공개키 기반 인증을 사용 yes는 사용, no 는 미사용 |
TCPKeepAlive | yes로 설정하면 지속적으로 keppalive 메시지를 전송하여 연결상태를 체크 네트워크 문제가 발생하면 리소스를 계속적으로 점유하지 않도록 반환하고 연결 끊음. |
2) PAM(Puggable Authentication Module)
1. PAM 의 설명
리눅스 시스템에서 사용자가 어플리케이션이나 서비스를 이용하고자 할때 동적으로 인증할 수 있는 공유 라이브러리 스위트
저수준의 인증 모듈을 고수준의 API로 통합하여 어플리케이션에 대한 동적 인증 지원을 제공.
이를 통해 인증 시스템의 세세한 사항을 알 필요없이 동적인증 기능을 수행하는 어플리케이션 개발 가능.
2. PAM 환경설정하기
환경설정 주요항목은 /etc/pam.conf 파일과 /etc/pam.d 디렉터리.
만약 /etc/pam.d 디렉터리가 존재한다면 /etc/pam.conf 설정은 무시.
3) PAM 환경설정 샘플
1. PAM 환경설정
#%PAM-1.0 auth required pam_securetty.so #사용자가 root 권한으로 로그인 하려고할 때 /etc/security 파일에 해당 사용자가 존재하는지 체크. auth required pam_unix.so nullok #사용자에게 패스워드를 입력받아 /etc/shadow 파일이 존재한다면 해당 파일의 정보와 체크하고 그렇지 않으면 /etc/passwd 파일의 정보를 사용하여 패스워드 체크를 수행. nullok 는 공백 패스워드를 허용하겠다는 의미 auth required pam_nologin.so #/etc/nologin 파일이 존재하고 사용자가 root가 아니파면 인증을 실패. auth required pam_unix.so #패스워드 인증에 앞서 계정에 대한 검증작업을 수행. password required pam_cracklib.so retry=3 #패스워드가 만료되면 pam_cracklib.so는 새로운 패스워드를 입력하라는 메시지를 사용자에게 출력. retry=3 의미는 강한패스워드 입력기회 2회. password required pam_unix.so shadow nullok use_authtok #pam_unix.so 가 제공하는 passwd 인터페이스를 통해 사용자의 패스워드를 변경 #shadow는 사용자가 패스워드를 변경할 때 셰도우 패스워드 파일을 생성함. #use_authtok 는 사용자에게 새 패스워드를 묻지않고 앞서 실행했던 password 모듈에서 받은 패스워드 사용할 수 있게 함. session required pam_unix.so #pam_unix.so가 세션 관리 역할을 수행. /var/log/secure 에 세션 시작부터 끝까지 사용자 명과 세션 유형을 로그로 남김. |
3) sudo(Super User DO)
1. 설명
- 사용자가 잠시 root 권한을 요구하는 프로그램을 실행해야 할 때 sudo 명령어를 사용.
- Windows의 관리자 권한으로 실행 기능과 유사
- /etc/sudoers 파일에 등록된 사용자만 사용가능하다.
2. /etc/sudoers 파일 편집하기
user는 사용자명이나 그룹명을 뜻하고 hostname 은 로그인한 컴퓨터 의미
runas-user는 해당 사용자가 실행하는 계정을 의미하고 runas-group은 해당 사용자가 실행하는 그룹을 의미
commands 는 root 권한으로 실행을 허가하는 명령어를 뜻하며 여러개 입력 가능.
ALL=ALL 의미는 로그인 위치에 관계없이 모든 명령어에 대해 sudo 명령어 사용 할 수 있다는 의미.
visudo 명령어를 사용해 /etc/sudoers 파일을 편집.
$sudo visudo
%mygroup ALL=(ALL:ALL) ALL
3. sudo 명령어 사용하기
chris 사용자 및 mygroup의 권한으로 /home/chris/newfile 디렉터리를 생성
$sudo -u chris -g mygroup mkdir /home/chris/newfiles |
주요 보안 도구
1) nmap(Network Mapper)
1. 설명
nmap 은 네트워크 탐지 및 보안 감사를 위한 오픈소스 도구
단일 호스트에 대한 스캔뿐 아니라 거대한 네트워크도 스캔할 수 있도록 설계
nmap은 주로 호스트가 네트워크상에서 검색 가능한지 사용하고 있는 포트가 무엇이 있는지 스캔 용도로 주로 사용.
2. 동작 원리
TCP 포트 확인을 위해 SYN 패킷을 113번 포트로 보내 상대방 호스트가 SYN/ACK 패킷을 보내오면 열려있고
RST 패킷을 보내오면 닫힌 포트로 판단.
3. nmap 의 설치
yum 패키지 관리도구를 통해 설치
$sudo yum install -y nmap
4. 사용예시
호스트 이름으로 스캔하면 호스트의 IP 주소, DNS 레코드, 포트정보 등을 확인
$nmap google.com
2) tcpdump
1. 설명
네트워크 인터페이스의 송수신 패킷 캡쳐를 수행하는 명령행에서 실행할 수 있는 네트워크 트래픽 모니터링 도구
네트워크 응용 프로그램이나 데몬의 오류나 네트워크의 상태를 분석하고 원인을 찾는데 도움을 줌.
2. 주요예제
eth0 인터페이스를 통해 송수신되는 재킷을 모두 캡쳐
$sudo tcpdump -i eth0 -n
eth0 인터페이스에 대해 192.168.1.3 호스트의 5060 포트로 송수신되는 모든 패킷을 캡쳐하여 /usr/src/dump 파일에 생성.
-vvv 옵션 사용하면 상세히 정보남김
$sudo tcpdump -i eth0 host 192.168.1.3 and port 5060 -n -vvv -w /usr/src/dump
3) tripwire
1. 설명
호스트 기반 침입 탐지 시스템으로서 외부 침입으로 인한 파일시스템상의 주요 시스템 파일의 변경을 탐지하는 무결성 도구.
시스템이 정상 운영 상태일 때 전체 파일들의 스냅샵을 보관하고 파일의 변경이 발생했을 때마다 스냅샷과 비교하여 침입이 이루어졌는지 판단.
2. tripwire의 설치
epel-release 레파지터리 설치하고 tripwire 패키지 다운로드
$sudo yum install epel-release
$sudo yum install tripwire
3. tripwire의 실행
- 사이트 키와 로컬 키 준비
$sudo tripwire-setup-keyfiles - 시스템 최초 스냅샷 생성
$sudo tripwire --init - 새로운 파일이 생성되었음을 제대로 체크하는지 확인하기위해 임의의 파일 생성
touch tripwire-check-files - 스냅샷과 현재 파일 시스템의 상태를 비교
$sudo tripwire --check - 결과파일을 report.txt로 생성
$sudo twprint --print-report --twrfile /var/lib/tripwire/report/localhost.localdomain-20191105-151441.twr > report.txt - report.txt 의 결과의 중간에 Tripwire Data Files 항목에 1개의 파일이 추가되었음을 확인
4) Nessus
1. 설명
상용 취약점 스캐너. 세계에서 가장 많이 사용하는 취약점 스캐너
2. 특징
해커가 원격으로 접속해 민감한 데이터에 접근하는 취약점을 탐지
오픈 메일 릴레이나 중요 패치 미적용 등 잘못된 시스템 설정을 탐지.
시스템 계정의 빈 패스워드나 기본 패스워드 등 탐지
TCP/IP 스택의 패킷을 악의적으로 조작하여 서비스 거부 공격의 수행을 탐지.
3. Nessus 설치
패키지 다운로드
$sudo rpm -ivh Nessus-8.7.2-es6.i386.rpm
데몬 시작
$sudo /sbin/service nessusd start
https://localhost.localdomain:8834/에 방문해 설치 완료
5) GnuPG(GNU Privacy Guard)
1. 설명
PGP를 대체하기 위한 자유 소프트웨어
공개키 기반 암호화와 디지털 서명 관련 기능을 제공.
2. 공개키 기반 암호화
키 교환에 따른 키 유출을 막을수 있다.
송신자는 공개키로 평문을 암호화하여 수신자에게 전송.
수신자는 개인키를 사용해 암호문을 복호화하여 평문을 얻음.
이때 개인키 교환이 일어나지 않기 때문에 키 유출이 발생하지 않음.
3. 디지털 서명
개인키는 다른 사람과 교환하지 않고 본인만 소유,
개인키로 원문을 암호화 하고 서명된 문서를 수신측에 보냄.
수신자는 공개키를 통해 서명된 문서를 복호화하여 문서가 발신자로부터 온 문서인지 검증.
개인키와 공개키는 쌍이기 때문에 다른 개인키로 암호화되어 있다면 해당 공개키로 서명된 문서를 복호화 할 수 없음.
6) John The Ripper
무료 패스워드 크래킹 도구.
유닉스 시스템에서 처음 개발됨.
미리 준비하나 단어 사전을 기반으로 무작위 대입공격을 수행하여 패스워드를 알아내는 방식을 취함.
악의적인 목적으로 크래킹 용도로 사용될 수도 있지만 서버의 패스워드 보안성을 파악하기 위한 진단 목적으로 활용 가능.