[리눅스마스터 1급] 이기적 이론서 9회차 정리 - 시스템 보안 및 관리
🏁 이기적 이론서 학습 범위
- PART 01 리눅스 시스템 관리
- CHAPTER 03 시스템 보안 및 관리 (SECTION 02 시스템 보안 및 관리)
시스템 보안 및 관리
☑️ 시스템 보안 관리
물리적 보안
- 물리적 보안
- 보안에 민감한 서버에 대해 허가 받지 않은 사용자가 물리적으로 접근하지 못하게 한다.
- 물리적 보안 방안
- 폐쇄회로텔레비전(CCTV)를 설치하여 서버를 감시한다.
- 동작 감지 또는 열화상 보안 카메라를 설치한다.
- 경비 시스템을 강화한다.
- 보안 ID를 발급하고 인가된 사용자만 출입할 수 있도록 한다.
- 자동 잠김 기능이 있는 강화도어를 설치한다.
시스템 보안
- BIOS 보안
- BIOS 설정을 변경하여 CD-ROM이나 DVD-ROM 또는 USB 등으로 부팅하여 리눅스의 복구모드로 진입 가능하므로 BIOS에 비밀번호를 설정한다.
- 패스워드 보안
- root 사용자는 허가되고, 제한된 사용자에게만 부여해야 한다.
/etc/password 파일 중 UID가 0인 사용자가 있는 지 점검해야 한다.
$ cat /etc/passwd |grep x:0:
- 누구나 읽을 수 있는
/etc/password
가 아닌 root 사용자만 읽을 수 있는 SHA512로 해시를 만들어내는/etc/shadow
를 사용하는 것이 안전하다.- 무작위 대입 공격(brute force attack)을 막지는 못한다.
- 무작위 대입 공격을 막기 위해 강력한 패스워드를 설정해야 한다.
- 사전에 존재하지 않는 랜덤 문자열 단어의 연속된 패스워드가 강력하다.
- 강력한 패스워드 입력을 강제하기 위해 PAM(Pluggable Authentication Modules) 중
pamcracklib.so
를 사용한다. 사용자가 패스워드를 정기적으로 변경하도록 유도하기 위해
chage
명령어나User Manager(system-config-users)
애플리케이션을 사용할 수 있다.# 특정 사용자의 패스워드 만료일을 90일로 설정 $ chage -M 90 <username>
- 관리자 계정 보안
- root 사용자의 로그인은 제한하고
su
또는sudo
명령어를 통해 필요할 때 일시적으로 관리자 권한을 부여하는 게 안전하다.root
사용자의 로그인 제한을 위해/etc/passwd
파일의 root 사용자의 셸 설정을/sbin/nologin
으로 변경한다.
- SSH 프로토콜을 통한 root 사용자 로그인을 막기 위해서는
/etc/ssh/sshd_config
파일에서PermitRootLogin no
를 기입한다.- 만약
#
로 주석처리 되어 있다면 주석을 제거한다.
- 만약
- root 사용자의 로그인은 제한하고
- 서비스 및 운영 보안
- 필수 서비스만 사용
- 리눅스 배포판은 대부분 사용자의 편의를 위해 사용하지 않는 서비스나 응용 프로그램이라 하더라도 기본으로 설치가 된다.
- 이는 보안 취약점이 되므로 사용하는 서비스만 남기고 나머지는 삭제하는 것이 좋다.
- 최소 설치로 리눅스를 설치하고 필요한 내용만 추가 설치하는 것도 좋다.
- 시스템 정보 숨김
- 로그인 할 때
/etc/issue
또는/etc/issue.net
의 내용이 사용자의 터미널에 출력된다. - 기본적으로 배포판 버전과 커널 버전이 출력되는 경우가 많으므로 보안상 해당 파일을 수정하는 것을 권장한다.
- 로그인 할 때
- 부트로더 패스워드 설정
- root 패스워드 분실 시 복구 모드로 진입하거나 단일 사용자 모드로 부팅하여 root의 패스워드를 변경할 수 있다.
- 이를 방지하기 위해 부트로더에 패스워드를 설정한다.
grub에 패스워드를 설정하기 위해
grub-crypt
명령어를 사용한다.$ grub-crypt
grub-crypt
를 통해 생성된 암호화된 비밀번호를 grub 환경설정에 적용하기 위해 파일을 연다.$ sudo vi /boot/grub/grub.conf
grub.conf
에 다음을 추가한다.password --encrypted $fd9ed7bf4df05403d505de82583970c35aaf514cc820bfb12449b603c0eba31c
- 필수 서비스만 사용
- 보안 서비스 사용
- 원격 터미널 접속을 위해 telnet보다 ssh(secure shell)을 사용한다.
- telnet은 암호화되어 있지 않은 평문으로 패킷을 주고 받기 때문에
tcpdump
,wireshark
와 같은 패킷 캡쳐 도구를 통해 사용자의 정보가 노출될 수 있다.
파일 시스템 보안
- 소유권과 허가권
- 파일 및 디렉터리의 소유권 및 허가권을 필요한 만큼만 설정한다.
- 다른 사용자(others)의 허가권을
rwx
로 부여하는 것은 위험하다.
- 다른 사용자(others)의 허가권을
- 사용자에게 임시로 root 권한을 줄 수 있는
Set-UID
,Set-GID
,Sticky-Bit
와 같은 특수 권한의 사용은 관리되어야 한다.
- 파일 및 디렉터리의 소유권 및 허가권을 필요한 만큼만 설정한다.
- lsattr
- 파일 속성을 출력한다. (파일 허가권과 동일한 의미 X)
형식
lsattr [option] file
옵션
형식 설명 -R 디렉터리 하위의 모든 파일과 디렉터리의 속성을 재귀적으로 출력한다. -a .
으로 시작하는 파일을 포함한 모든 파일을 출력한다.예제
$ lsattr # 현재 디렉터리의 모든 파일과 디렉터리의 속성 출력 $ lsattr -a # 숨긴 파일인 "."으로 시작하는 파일도 출력 $ lsattr file1 # 특정 파일 속성 출력 $ lsattr file1 file2 # 특정 다수 파일 속성 출력 $ lsattr -R # 현재 디렉터리의 모든 파일과 디렉터리와 해당 디렉터리 하위의 모든 내용 출력
- chattr
- 파일의 속성을 수정한다.
형식
chattr [option] mode file
옵션
옵션 설명 -R 디렉터리 하부의 모든 파일과 디렉터리의 속성을 재귀적으로 수정한다. 모드
모드 설명 A 파일에 접근할 때 atime
을 수정하지 않는다.a - 해당 파일은 오직 추가만 할 수 있다.
- 덮어쓰거나 삭제하거나 이름을 변경할 수 있다.d dump
명령어로 백업할 때 이 속성을 갖는 파일은 통과한다.i 해당 파일은 삭제되거나 이름을 변경할 수 없다. S 파일의 속성이 변경됐을 때 그 즉시 디스크에 저장된다. e 해당 파일은 블록 익스텐트(block extents)를 사용하여 저장된다. 예제
$ sudo chattr +a file1 # file1 파일을 데이터 추가만 할 수 있는 속성인 'a'를 설정 $ sudo chattr +i file2 && lsattr file2 # file2를 삭제나 변경 불가능한 속정으로 설정 $ sudo chattr -i +a file2 && lsattr file2 # file2에 대해 'i' 옵션을 제거하고 'a' 추가
- getfacl
- 파일의 ACL(access control list)을 확인한다.
- 파일 이름, 소유자, 그룹, ACL 정보를 함께 출력한다.
- ACL을 지원하지 않는 파일 시스템에서 사용 시 ACL 대신 허가권을 출력한다.
형식
getfacl [option] file or directory
옵션
옵션 설명 -a, —access 파일의 ACL을 출력 -d, —default 기본 ACL을 출력 -R, —recursive 모든 파일과 디렉터리를 재귀적으로 탐색하여 ACL 정보 출력 -p, —absolute-names 절대 경로를 입력 예제
$ getfacl file1 # file1의 ACL 정보 출력 $ getfacl -p /etc/passwd # 절대 경로를 사용하여 /etc/passwd의 ACL 정보 출력
- setfacl
- 파일이나 디렉터리에 ACL을 설정한다.
- ACL은 access ACL과 기본 ACL 두 가지가 잇다.
- access ACL : 지정한 파일이나 디렉터리에 설정한 임의의 ACL
- 기본 ACL : 필수는 아니지만 디렉터리에 설정할 수 있다.
- 기본 ACL이 설정된 디렉터리에 access ACL이 지정되지 않은 파일이 생성되면 해당 파일은 디렉터리의 기본 ACL을 사용하게 된다.
형식
setfacl [option] file or directory
옵션
옵션 설명 -m, —modify 파일이나 디렉터리의 ACL을 추가하거나 변경한다. -x, —remove 파일이나 디렉터리의 ACL을 제거한다. -R, —recursive 디렉터리 하위의 모든 파일이나 디렉터리에 대해 재귀적으로 ACL을 설정한다. -b, —remove-all 모든 확장 ACL 엔트리를 제거한다. ACL 엔트리
종류 설명 d[efault]:][u[ser]:]uid [:perms] - 사용자를 이름으로 권한을 지정하거나 UID에 대한 권한을 설정한다.
- d는 기본 권한이다.[d[efault]:] g[roup]:gid [:perms] 그룹명이나 GID를 통해 권한 설정 [d[efault]:] m[ask][:] [:perms] 유효 권한 마스크를 설정 [d[efault]:] o[ther][:] [:perms] 다른 사용자에 대한 권한 설정 예제
$ setfacl -m u:evan:r file1 # even 에게 file1 파일의 읽기 권한 부여 $ setfacl -m m::rw file2 # 모든 사용자 및 그룹에게 file2 파일의 읽기, 쓰기 권한 부여 $ setfacl -x g:staff file1 # file1 파일에서 staff 그룹의 권한 삭제 $ getfacl file1 | setfacl --set-file=- file2 # file1의 ACL 정보를 file2에 그대로 적용 # /mydata 디렉터리에 기본 권한으로 francis가 rw 권한을 갖는다. # /mydata 안에 새로운 파일이 생성될 때 이 기본 권한을 따른다. $ setfacl -m d:u:francis:rw /mydata
네트워크 보안
- sysctl
/proc/sys
디렉터리 이하의 커널 매개변수를 확인하거나 설정한다./proc/sys/net
이하에는 네트워크 관련 커널 설정을 할 수 있는 경로이다.형식
sysctl [option] variable[=value]
옵션
옵션 설명 -a, -A 모드 커널 매개변수 출력 -p - sysctl
설정 파일을 로드
- 파일을 설정하지 않으면/etc/sysctl.conf
파일을 로드-n 지정한 변수 값 출력 -w 지정한 변수에 값을 저장 예제
$ sudo sysctl -a | grep net.ipv4.icmp # 모든 커널 파라미터 출력(여기서는 icmp 관련 내용만 출력) # ping 요청에 대해 응답을 주는 지 확인하기 위해 커널 파라미터 확인 $ sysctl -n net.ipv4.icmp_echo_ignore_all # ping 요청 거부하기 위해 1로 설정 $ do sysctl -w net.ipv4.icmp_echo_ignore_all=1 $ sudo sysctl -p # 현재 sysctl 설정 출력
sysctl을 통한 보안 강화 예시
보안위협 조치방법 서버 날짜 정보 유출 /proc/sys/netipv4/tcp_timestamps
를 0으로 설정하여 외부에서 서버 날짜 정보를 확인할 수 없도록 한다.SYN_FLOODING 공격 - TCP 연결 설정(3-way-handshake)의 특성을 이용한 공격이다. 클라이언트는 서버에 연결하기 위해 SYN 패킷을 전송하고 서버는 STN, 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
의 값을 1로 바꿔서 ping에 대한 응답을 주지 않을 수 있다.스머프 공격(smurf attack) - IP 브로드캐스트 주소를 통해 컴퓨터 네트워크로 ICMP 패킷을 전송하는 분산 서비스 거부 공격이다.
-/proc/sys/netipv4/icmp_echo_ignore_broadcasts
를 1로 설정하여 예방한다.과다 세션 공격 - 세션을 수십 만 개 만들어 더 이상 동작하기 어려운 상황을 만들 수 있는데, 이를 예방하기 위해 세션 종료 시간을 짧게 설정할 수 있다.
-/proc/sys/net/ipv4/tcp_fin_timeout
에 원하는 만료시간(초 단위)를 설정한다.tcp keepalive time 설정 /proc/sys/net/ipv4/ip_local_port_range
를 변경하여 서버가 실제 사용하는 포트 범위를 설정하여 실제 악성코드가 포트를 점유할 가능성을 줄일 수 있다.로컬 포트 사용범위 설정 /proc/sys/net/ipv4/ip_local_port_range
를 변경하여 서버가 실제 사용하는 포트 범위를 설정하여 실제 악성 코드가 포트를 점유할 가능성을 줄인다.IP 포워딩 기능 제한 - 라우터가 아닌 서버가 IP 포워딩 기능을 갖는 것은 보안 취약점이 된다.
- 이를 방지하기 위해/proc/sys/net/ipv4/ip_forward
를 0으로 변경한다.- 커널 설정을 영구적으로 반영하는 방버
sysctl
로 한 커널 설정은 시스템 리부팅 시 원래 값으로 복구된다.- 영구적으로 저장하기 위해서는
/etc/sysctl.conf
에 원하는 커널 파라미터의 설정값을 지정한다.
$ sudo vi /etc/sysctl.conf
- 다른 방법으로는
/etc/rc.d/rc.local
파일을 수정해 아래의 명령어를 입력하면 된다.
$ echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all OR $ sysctl -w net.ipv4.icmp_echo_ignore_all=1
☑️ SELinux(Security-Enhanced Linux)
SELinux
- 필요성
- 리눅스는 root 권한 획득시 시스템의 모든 제어가 가능하다.
- 이를 막기 위해, root 권한 취약점에 대한 리포트를 모니터링하고 패치를 적용하려는 노력을 기울여야 한다.
- root 권한으로 실행하는 데몬을 최소로 유지해야 하지만 포트번호 1024 이하의 잘 알려진 포트(well-known port)의 경우 root만 사용할 수 있어 필연적으로 root 권한을 사용해야 한다.
- root 권한이라 해도 미리 지정한 권한으로 리소스를 접근 가능하게 하는 강제 접근 제어가 가능하다면 root 권한이 탈취되더라도 시스템 피해를 최소화할 수 있다.
- 이런 배경으로 연구 개발을 진행한 리눅스가 SELinux이다.
- 리눅스는 root 권한 획득시 시스템의 모든 제어가 가능하다.
- SELinux
- 미국 NSA에 의해 연구된 프로젝트이다.
- 강제 접근 제어(MAC)와 같은 접근 제어 정책을 제공하는 리눅스 커널 보안 모듈이다.
- MAC은 모든 주체(사용자, 프로그램, 프로세스)와 객체(파일, 디바이스)에 대해 국부적으로 허가하는 접근 제어 정책이다.
- 모든 접근 불가이며 정책에 따라 필요한 기능에 대해서만 사용 권한을 안전하게 부여하는 것
- SELinux의 특징
- 기본 기능으로 일반적인 리눅스 배포판을 사용하면 기본으로 포함되어 있다.
- 리눅스 레드햇 등 리눅스 배포판에는 이미 사전에 잘 정의된 정책이 탑재되어 있다.
- 제로데이 공격(zero-day attack)으로 시스템이 공격받더라도 피해를 최소화한다.
SELinux의 설정 및 해제
- 동작모드
- 레드햇 계열에서는 기본으로
enforce mode
로 동작하고 정책에 어긋나는 동작은 거부된다.
모드 설명 enforce - SELinux의 정책을 적용한 상태 - 정책을 위반하는 동작 차단 permissive - 정책 위반 행위가 차단되지 않지만 로그로 남겨진다.
- 처음 SELinux를 도입할 때 permissive 모드에서 위반 동작을 해결하고 단계적으로 enforce 모드로 넘어가는 것도 좋은 방안이다.disable SELinux의 정책 비용을 비활성화 - 레드햇 계열에서는 기본으로
SELinux의 모드 확인하기
$ sestatus # 모드 확인 $ sudo setenforce enforcing # setenforce로 enforce 모드로 변경 # 또는 /etc/sysconfig/selinux 파일에 SELINUX 변수 값을 수정하여 영구 반영 # This fil controls the state of SELinux on the system. # (중간 생략) SELINUX=enforcing
☑️ 시스템 보안 유틸리티
ssh(Secure Shell)
- ssh
- 원격 서버나 시스템에 안전하게 연결하기 위한 프로토콜
- 호스트와 클라이언트 간 패킷을 암호화하여 주고 받음으로써 보안에 강하다.
- 포트 번호는 22번을 사용한다.
- 준비사항
- ssh 접속을 위한 클라이언트 설치가 필요하다.
- 레드햇 계열에서는
openssh-clients
패키지를 통해 ssh 클라이언트를 설치한다.
$ sudo yum install -y openssh-clients
- 레드햇 계열에서는
- 원격 컴퓨터에는 ssh 서버를 설치하고 실행중이어야 한다.
- 원격 컴퓨터는 IP 주소 또는 도메인명을 제공해야 한다.
- ssh 접속을 위한 클라이언트 설치가 필요하다.
ssh 서버 설치
$ sudo yum install -y openssh-server # openssh-server 패키지 설치 $ systemctl start sshd # sshd 서비스 시작 $ systemctl enable sshd # 부팅 시 자동으로 sshd 데몬을 시작하기 위해 환경설정에 추가
- 비밀번호 인증을 통한 ssh 서버 접속
openssh-clients
패키지를 설치하면ssh
명령어를 사용할 수 있다.-l
옵션을 사용하여 로그인시 사용할 계정을 입력하고 원격지의 IP 주소를 입력하면 ssh 연결을 간단히 할 수 있다.또는
ssh francis@192.168.100.100
과 같은 방식으로 접속할 수 있다.$ ssh -l frnacis 192.168.100.100 # 현재 로그인한 계정과 동일한 계정으로 ssh 접속 시, 간단히 IP 주소만 입력 가능 $ ssh 127.0.0.1 # 만약 ssh 포트 번호가 22번이 안니 1800이면 -p 옵션으로 포트 번호를 변경하여 접속 $ ssh -p 1800 francis@192.168.100.100
- 인증키를 통한 ssh 자동 접속
ssh-keygen
명령어로 개인키와 공개키를 생성하고 공개키를 원격 서버에 복사해두면 비밀번호 없이 ssh 접속이 가능하다.# ssh-keygen을 통해 개인키와 공개키 생성 (-t 옵션은 알고리즘을 결정할 수 있는 dsa, rsa 등을 지정) $ ssh-keygen -t dsa $ ls # 홈디렉터리의 .ssh 디렉터리에 개인키인 id_dsa와 공개키인 id_dsa.pub가 생성됨 $ ls id_dsa id_dsa.pub knwon_hosts # 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
- sshd 환경설정
- sshd 데몬의 환경설정은
/etc/ssh/sshd_config
에서 수행 가능하다.- ssh 클라이언트의 환경설정 파일은
/etc/ssh/ssh_config
이다. - 데몬스크립트의 위치는
/usr/lib/systemd/system/sshd.service
이다.
- ssh 클라이언트의 환경설정 파일은
ssh 데몬의 주요 환경설정 항목이다.
환경설정 설명 Port - ssh가 사용하는 포트이며, 기본값은 22이다.
- 외부 접근을 막기 위해 다른 포트로 변경 가능하다.PermitRootLogin - yes로 설정 시 ssh root@localhost와 같이 root로 로그인 가능하다.
- 보안 위협이 될 수 있기에 no로 설정하는 게 안전하다.AllowUsers - 허용된 사용자만 ssh 접속이 가능하도록 한다.
- 모두 사용하도록 하려면 공백으로 두고 특정 사용자로 지정하려면 다음과 같은 형식으로 설정한다.
- AllowUsers francis chris(francis 와 chris만 ssh 접속이 가능하다)LoginGraceTime - 사용자 로그인을 기다리기 위한 대기시간
- 보통 2m로 설정하는데 무차별 대입 공격을 막기 위해 더 짧게 설정하면 더욱 안전하다.PasswordAuthentication - 비밀번호 인증을 통한 접속 활성화 여부를 설정한다.
- 공개키 인증을 사용하지 않으면 반드시 yes로 설정해야 한다.PubkeyAuthentication - 보안 강화를 위해 공개키 기반 인증을 사용할 수 있다.
- yes는 사용, no는 미사용TCPKeepAlive - yes로 설정하면 지속적으로 keepalive 메시지를 전송하여 연결상태를 체크한다.
- 네트워크 문제가 발생하면 리소스를 계속적으로 점유하지 않도록 반환하고 연결도 끊는다.
- sshd 데몬의 환경설정은
Pam(Pluggable Authentication Module)
- PAM
- 리눅스 시스템에서 사용자가 애플리케이션이나 서비스를 이용하고자 할 때 동적으로 인증할 수 있는 공유 라이브러리 스위트
- 저수준의 인증 모듈을 고수준의 API로 통합하여 애플리케이션에 대한 동적 인증 지원을 제공할 수 있다.
- 개발자는 인증 시스템의 세세한 사항을 알 필요 없이 동적 인증 기능을 수행하는 애플리케이션을 개발할 수 있다.
- 환경설정
/etc/pam.conf
파일과/etc/pam.d
디렉터리가 주요 항목이다./etc/pam.d
가 존재한다면/etc/pam.conf
의 설정은 무시된다.
$ cat /etc/pam.d/sshd # sshd의 환경설정 내용 출력
환경 설정 파일 구성항목
항목 설명 module-type 모듈 유형을 뜻한다.
- account : 사용자의 패스워드가 만료되었는지, 서비스에 대한 접근이 허가되었는지 등 계정에 대한 검증 작업 수행 - auth: 사용자를 실제로 인증
- password: 사용자 패스워드를 갱신하고 auth 모듈과 연동됨
- session: 세션의 시작, 종료와 관련된 작업을 수행한다.control-flag PAM 관련 모듈은 시스템 아키텍처에 따라 /lib/security 또는 /lib64/security에 위치한다. 각 PAM 모듈의 수행 결과에 따라 인증 성공, 실패에 따른 처리 방안을 control-flags를 통해 정할 수 있다.
- requisite : 이 플래그가 설정된 모듈의 체크는 반드시 성공되어야 한다. 체크가 실패할 경우 그 즉시 실패를 반환한다.
- required : 이 플래그가 설정된 모듈의 체크는 반드시 성공되어야 한다. 즉시 실패하지 않고 동일한 module-type의 모듈 체크를 모두 수행하고 나서 실패를 반환한다.
- sufficient : 이 플래그가 설정된 모듈의 체크가 성공하면 더 이상 나머지 모듈들의 체크를 수행하지 않는다. 이전에 requisite나 required의 실패는 없어야 한다.
- optional : 해당 모듈의 체크가 성공하든 실패하든 중요하지 않다. 그러나 다른 모듈의 체크가 모두 성공했다면 이 모듈의 결과를 응용 프로그램에게 반환한다.
- include : 지정한 환경설정 파일을 로드하여 적용한다.module-name 환경설정 대상이 되는 모듈의 이름을 입력한다. ( /lib/security
or/lib64/security
에 위치한 모듈명)module-arguments module-name
항목에서 지정한 모듈에게 전달하려는 파라미터를 설정한다.
PAM 환경설정 샘플
PAM 환경설정 샘플
#%PAM-1.0 auth required pam_securetty.so auth required pam_unix.so nullok auth required pam_nologin.so account required pam_unix.so password required pam_cracklib.so retry=3 password required pam_unix.so shadow nullok use_authtok session required pam_unix.so
#
으로 시작하는 줄은 주석이다.auth required pam_securetty.so
- 사용자가 root 권한으로 로그인하려 할 때
/etc/security
에 해당 사용자가 존재하는 지 체크한다. - 존재한다면 로그인을 허가하고 존재하지 않으면 로그인이 실패했음을 사용자에게 알린다.
- 사용자가 root 권한으로 로그인하려 할 때
auth required pam_unix.so nullok
- 사용자에게 패스워드를 입력 받아
/etc/shadow
파일이 존재한다면 해당 파일의 정보를 체크한다. - 그렇지 않으면
/etc/passwd
파일의 정보를 사용하여 패스워드 체크를 수행한다. nullok
의 역할은 공백 패스워드를 허용한다는 것
- 사용자에게 패스워드를 입력 받아
auth required pam_nologin.so
- 마지막 인증 단계로서
/etc/nologin
파일이 존재하고 사용자가 root가 아니면 인증 실패
- 마지막 인증 단계로서
account required pam_unix.so
- 패스워드 인증에 앞서 계정에 대한 검증 작업을 수행한다.
- ex. 계정이 만료되었는지 패스워드 변경 기간 내에 패스워드를 바꿨는지 등을 체크한다.
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
: 사용자가 패스워드를 변경할 때 셰도우 패스워드 파일을 생성하는 것nullok
: 사용자가 공백 패스워드를 입력 가능use_authtok
: 사용자에게 새 패스워드를 묻지 않고 앞서 실행했던password
모듈에서 받은 패스워드를 받을 수 있도록 한다.
session required pam_unix.so
pam_unix.so
가 세션관리 역할을 수행하며,/var/log/secure
에 세션 시작부터 끝까지 사용자명과 세션 유형을 로그로 남긴다.
sudo(Super User DO)
- sudo
- 사용자가 잠시 root 권한을 요구하는 프로그램을 실행할 때
sudo
를 사용할 수 있다. - 아무나 사용할 수 있는 명령어는 아니고
/etc/sudoers
파일에 등록된 사용자만 사용할 수 잇다.- 직접 파일을 수정할 수 있지만 안전한 편집을 위해
visudo
명령어를 사용하길 권장한다.
- 직접 파일을 수정할 수 있지만 안전한 편집을 위해
- 사용자가 잠시 root 권한을 요구하는 프로그램을 실행할 때
- /etc/sudoers 파일 편집하기
/etc/sudoers
파일에 사용자를 등록하는 형식user
: 사용자명이나 그룹명을 뜻한다.hostname
: 로그인한 컴퓨터를 의미한다.runas-user
: 해당 사용자가 실행하는 계정runas-group
: 해당 사용자가 실행하는 그룹commands
: root 권한으로 실행을 허가하며, 여러 개 입력할 수 있다. 예를 들어ALL=ALL
의 의미는 로그인 위치에 관계없이 모든 명령어에 대해sudo
를 사용할 수 있다는 것
user hostname=(runas-user:runas-gropu) commands
visudo
를 사용하여/etc/sudoers
파일을 편집한다.$ sudo visudo
예제
# francis는 로그인 위치에 관계없이 어떤 사용자나 어떤 그룹으로서 어떤 명령어이든 sudo 명령어를 실행할 수 있다. $ francis ALL=(ALL:ALL) ALL # mygroup 그룹에 속한 사용자는 로그인 위치에 관계없이 어떤 사용자나 어떤 그룹으로서 어떤 명령어이든 sudo 명령어를 실행할 수 있다. $ %mygroup ALL=(ALL:ALL) ALL # chris는 myhost에서 로그인 시 webuser 사용자와 webusers 그룹으로서 어떤 명령어든 sudo 명령어를 실행할 수 있다. chris myhost=(webuser:webusers) ALL
- sudo 명령어 사용하기
/etc/sudoers
설정된 사용자에 한하여 프로그램 실행 시 root 권한을 임시로 부여한다.형식
sudo [option] username command
옵션
옵션 설명 -u root 사용자가 아닌 지정한 사용자의 권한으로 실행한다. -g 명령어 실행 시 지정한 그룹의 권한으로 실행한다. 예제
$ sudo shutdown -r now # root 권한으로 shutdown 명령어에 -r now 인자를 입력하여 실행 $ sudo -u chris ls /home/chris # chris 사용자의 권한으로 /home/chris 디렉터리를 ls 함 # chris 사용자 및 mygroup의 권한으로 /home/chris/newfiles 디렉터리 생성 $ sudo -u chris -g mygroup mkdir /home/chris/newfiles
☑️ 주요 보안 도구
nmap(Network Mapper)
- nmap
- 네트워크 탐지 및 보안 감시를 위한 오픈 소스 도구
- 단일 호스트 및 거대한 네트워크를 스캔할 수 있도록 설계되었다.
- 주로 호스트가 네트워크 상에서 검색 가능한지 혹은 사용하고 있는 포트가 무엇이 있는 지 스캔 용도로 주로 사용된다.
- 동작원리
- TCP 포트가 열려있는지 확인하기 위해 SYN 패킷을 113번 포트로 보내고, 상대방 호스트가 SYN/ACK 패킷을 보내오면 열려 있고 RST 패킷을 보내오면 닫힌 포트로 판단한다.
- 이 방식은 TCP 연결 방식인 3-way handshake의 방식을 역이용한 것이다.
- nmap의 설치
yum
패키지 관리 도구를 통해 간단히 설치할 수 있다.$ sudo yum install -y nmap
- 사용 예시
- 호스트 이름으로 스캔하면 호스트 IP 주소, DNS 레코드, 포트 정보 등을 확인할 수 있다.
$ nmap google.com $ nmap -p 1-10000 localhost # localhost에 대해 1~10000 포트 사이를 스캔 $ sudo nmap -O google.com # google.com에 대한 운영체제 정보 취득(root 권한 필요)
tcpdump
- 네트워크 인터페이스의 송수신 패킷 캡쳐를 수행하는 명령행에서 실행할 수 있는 네트워크 트래픽 모니터링 도구
- 그래픽 기반 프로그램으로 wireshark가 유명하다.
- 네트워크 응용 프로그램이나 데몬의 오류나 네트워크 상태를 분석하고 원인을 찾는 데 도움을 준다.
예제
# eth0 인터페이스를 통해 송수신되는 패킷을 모두 캡쳐한다. # -n 옵션을 사용하면 IP 주소를 호스트명으로 변환하지 않는다. $ sudo tcpdump -i eth0 -n # eth0 인터페이스에 대해 102.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
tripwire
- 호스트 기반 침입 탐지 시스템으로 외부 침입으로 인한 파일 시스템상의 주요 시스템 파일의 변경을 탐지하는 무결성 도구
- 시스템이 정상 운영 상태일 때 전체 파일들의 스냅샷을 보관하고 파일 변경이 발생할 때마다 스냅샷과 비교하여 침입이 이루어졌는지 판단한다.
- 만약 관리자가 변경하였거나 정상적인 방법으로 변경된 것이면 스냅샷을 최신화한다.
설치
# epel-release 레포지토리를 설치하면 tripwire 패키지를 다운받을 수 있다. # 레드햇 계열에는 기본적으로 tripwire가 포함되어 있지 않다. $ sudo yum install epel-release $ sudo yum install tripwire # tripwire 패키지 설치
실행
$ sudo tripwire-setup-keyfiles # 사이트 키와 로컬 키를 준비 $ sudo tripwire --init # 시스템의 최초 스냅샷 생성 $ touch tripwire-check-files # 새로운 파일이 생성되었음을 제대로 체크하는지 확인하기 위해 임의의 파일 생성 # 스냅샷과 현재 파일 시스템 상태 비교 $ sudo tripwire --check $ sudo twprint --print-report --twrfile /var/lib/tripwire/report/localhost.localdomain-20191105-151441.twr > report.txt # 결과 파일을 report.txt로 생성 # report.txt 결과 확인 $ less report.txt
Nessus
- 상용 취약점 스캐너로 세계에서 가장 많이 사용하는 취약점 스캐너
- 특징
- 해커가 원격으로 접속해 민감한 데이터에 접근하는 취약점 탐지
- 오픈 메일 릴레이나 중요 패치 미적용 등과 같은 잘못된 시스템 설정을 탐지
- 시스템 계정의 빈 패스워드나 기본 패스워드 등을 탐지
- TCP/IP 스택의 패킷을 악의적으로 조작해 서비스 거부 공격의 수행을 탐지
- 설치
https://tenable.com/products/nessus
에서 nessus Essentials를 리눅스 배포판에 맞게 다운로드한다.# 레드햇 계열 6버전의 32bit CPU를 사용하면 아래 패키지를 다운받아 rpm 패키지 관리자를 통해 설치 $ sudo rpm -ivh Nessus-8.7.2-es6.i386.rpm # nessus 데몬 시작 $ sudo /sbin/service nessued start
브라우저에서
https://localhost.localdomain:8834/
에 방문해 nessus 설치를 완료한다.
GnuPG(GNU Privacy Guard)
- PGP를 대체하기 위한 자유 소프트웨어
- 전 세계적으로 이메일 보안의 표준으로 자리잡았다.
- 공개키 기반 암호화와 디지털 서명 관련 기능을 제공한다.
- 공개키 기반 암호화
- 기존에는 발신자와 수신자가 키를 공유하고 해당 키를 통해 평문을 암호화한 암호문을 주고 받았다.
- 키 교환 과정에서 키가 유출될 가능성이 있어 보안 위험성이 존재한다.
- 공개키 기반 암호화를 사용하면 키 교환에 따른 키 유출을 막을 수 있다.
- 송신자는 공개키로 평문을 암호화하여 수신자에게 전송한다.
- 수신자는 개인키를 사용해 암호문을 복호화하여 평문을 얻을 수 있다.
- 개인키 교환이 일어나지 않아 키 유출이 발생하지 않는다.
- 기존에는 발신자와 수신자가 키를 공유하고 해당 키를 통해 평문을 암호화한 암호문을 주고 받았다.
- 디지털 서명(digital signature)
- 개인키는 다른 사람과 교환하지 않고 본인만 소유한다.
- 개인키로 원문을 암호화하고 서명된 문서를 수신 측에 보낸다.
- 수신자는 공개키로 서명된 문서를 복호화하여 문서가 발신자로부터 온 문서인지 검증한다.
- 개인키와 공개키는 쌍으로 이루어져 다른 개인키로 암호화되어 있다면 해당 공개키로 서명된 문서를 복호화할 수 없다.
John The Ripper
- 무료 패스워드 크래킹 도구
- 유닉스 시스템에서 처음 개발되었고, 현재 리눅스, Windows, macOS, 안드로이드를 비롯해 다양한 운영체제에 포팅되었다.
- 미리 준비한 단어 사전을 기반으로 무작위 대입 공격을 수행해 패스워드를 알아내는 방식이다.
- 악의적인 목적을 가지고 크래킹 용도로 사용될 수 있지만, 서버의 패스워드 보안성을 파악하기 위한 진단 목적으로도 사용할 수 있다.