[리눅스마스터 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 를 기입한다.
      • 만약 # 로 주석처리 되어 있다면 주석을 제거한다.
  • 서비스 및 운영 보안
    • 필수 서비스만 사용
      • 리눅스 배포판은 대부분 사용자의 편의를 위해 사용하지 않는 서비스나 응용 프로그램이라 하더라도 기본으로 설치가 된다.
      • 이는 보안 취약점이 되므로 사용하는 서비스만 남기고 나머지는 삭제하는 것이 좋다.
      • 최소 설치로 리눅스를 설치하고 필요한 내용만 추가 설치하는 것도 좋다.
    • 시스템 정보 숨김
      • 로그인 할 때 /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 로 부여하는 것은 위험하다.
    • 사용자에게 임시로 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- 해당 파일은 오직 추가만 할 수 있다.
      - 덮어쓰거나 삭제하거나 이름을 변경할 수 있다.
      ddump 명령어로 백업할 때 이 속성을 갖는 파일은 통과한다.
      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이다.
  • SELinux
    • 미국 NSA에 의해 연구된 프로젝트이다.
    • 강제 접근 제어(MAC)와 같은 접근 제어 정책을 제공하는 리눅스 커널 보안 모듈이다.
    • MAC은 모든 주체(사용자, 프로그램, 프로세스)와 객체(파일, 디바이스)에 대해 국부적으로 허가하는 접근 제어 정책이다.
      • 모든 접근 불가이며 정책에 따라 필요한 기능에 대해서만 사용 권한을 안전하게 부여하는 것
  • SELinux의 특징
    • 기본 기능으로 일반적인 리눅스 배포판을 사용하면 기본으로 포함되어 있다.
    • 리눅스 레드햇 등 리눅스 배포판에는 이미 사전에 잘 정의된 정책이 탑재되어 있다.
    • 제로데이 공격(zero-day attack)으로 시스템이 공격받더라도 피해를 최소화한다.

SELinux의 설정 및 해제

  • 동작모드
    • 레드햇 계열에서는 기본으로 enforce mode로 동작하고 정책에 어긋나는 동작은 거부된다.
    모드설명
    enforce- SELinux의 정책을 적용한 상태 - 정책을 위반하는 동작 차단
    permissive- 정책 위반 행위가 차단되지 않지만 로그로 남겨진다.
    - 처음 SELinux를 도입할 때 permissive 모드에서 위반 동작을 해결하고 단계적으로 enforce 모드로 넘어가는 것도 좋은 방안이다.
    disableSELinux의 정책 비용을 비활성화
  • 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 서버 설치

      $ 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 데몬의 주요 환경설정 항목이다.

      환경설정설명
      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 메시지를 전송하여 연결상태를 체크한다.
      - 네트워크 문제가 발생하면 리소스를 계속적으로 점유하지 않도록 반환하고 연결도 끊는다.

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-flagPAM 관련 모듈은 시스템 아키텍처에 따라 /lib/security 또는 /lib64/security에 위치한다. 각 PAM 모듈의 수행 결과에 따라 인증 성공, 실패에 따른 처리 방안을 control-flags를 통해 정할 수 있다.
      - requisite : 이 플래그가 설정된 모듈의 체크는 반드시 성공되어야 한다. 체크가 실패할 경우 그 즉시 실패를 반환한다.
      - required : 이 플래그가 설정된 모듈의 체크는 반드시 성공되어야 한다. 즉시 실패하지 않고 동일한 module-type의 모듈 체크를 모두 수행하고 나서 실패를 반환한다.
      - sufficient : 이 플래그가 설정된 모듈의 체크가 성공하면 더 이상 나머지 모듈들의 체크를 수행하지 않는다. 이전에 requisite나 required의 실패는 없어야 한다.
      - optional : 해당 모듈의 체크가 성공하든 실패하든 중요하지 않다. 그러나 다른 모듈의 체크가 모두 성공했다면 이 모듈의 결과를 응용 프로그램에게 반환한다.
      - include : 지정한 환경설정 파일을 로드하여 적용한다.
      module-name환경설정 대상이 되는 모듈의 이름을 입력한다. (/lib/security or /lib64/security 에 위치한 모듈명)
      module-argumentsmodule-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 에 해당 사용자가 존재하는 지 체크한다.
      • 존재한다면 로그인을 허가하고 존재하지 않으면 로그인이 실패했음을 사용자에게 알린다.
    • 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 명령어를 사용하길 권장한다.
  • /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
      
    • 옵션

      옵션설명
      -uroot 사용자가 아닌 지정한 사용자의 권한으로 실행한다.
      -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, 안드로이드를 비롯해 다양한 운영체제에 포팅되었다.
  • 미리 준비한 단어 사전을 기반으로 무작위 대입 공격을 수행해 패스워드를 알아내는 방식이다.
  • 악의적인 목적을 가지고 크래킹 용도로 사용될 수 있지만, 서버의 패스워드 보안성을 파악하기 위한 진단 목적으로도 사용할 수 있다.

© 2021. All rights reserved.

yaejinkong의 블로그