ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 호스트 레벨의 세큐리티
    Technique/LPIC 2019. 11. 11. 16:08
    반응형

    세큐리트에 완벽은 없지만, 가능하다면 세큐리티를 높이기 위해 노력할 필요는 있다. 세큐리티를 높이기 위해서는 다음과 같은 방법이 존재한다.

     

    • 외부로부터의 유입에 대한 세큐리티를 높인다.
      • 필요한 소프트웨어만 인스톨하고 불필요한 서비스를 기동 하지 않는다.
      • 호스트 레벨의 적절한 액세서 제한을 실행한다.
      • 패킷 필터링에 의한 접근 제한
      • 세큐리티 정보의 확인을 엄격히 하며, 필요에 의해 빠르게 대책을 실시한다
    • 내부로부터의 세큐리티를 높인다
      • 적절한 유저 패스워드 관리를 실시한다.
      • 슈퍼유저 ( root) 권한으로 동작하는 프로그램을 최소화시키고 정기적으로 체크를 실시한다.

    슈퍼서버의 설정과 관리

    네트워크를 통한 서비스를 제공하고 있는 서버는 데몬이라고 불리는 상주 프로그램이다. 데몬은 상시 메모리상에 대기하고 있으며 클라이언트로부터의 요구를 감시하고 있다. 사용되지 않을 상태에도 메모리와 같은 리소스를 소비하고 있다. 상주하는 데몬의 수가 많을수록 대기 중의 데몬이 소비하는 시스템 리소스도 비례하여 많아진다.

     

    리소스
    메모리, CPU의 처리능력 디스크 영역 등 컴퓨터 시스템의 동작에 필요한 요소를 일컫는다.

    이것을 해결하기 위해서 서버 프로그램을 관리하는 슈퍼서버가 개발되었다. inetd나 xinetd라고 하는 슈퍼서버는 다른 서버 프로그램을 대신하여 요구를 감시하거나, 접속이 이루어지는 시점으로부터 본래의 서버 프로그램에 요구를 넘겨준다. 필요할 때에만 개개인의 서버 프로그램을 기동 하는 것으로 메모리 등의 시스템 리소스를 효율적으로 사용하는 것이 가능하다는 메리트가 있다. 또한 TCP Wrapper라고 하는 방법과 같이 이용하는 것으로 접속 제어를 집중적으로 관리하는 것이 가능하다.

     

    그에 반해 반응이 느려지고 마는 단점도 존재한다. 클라이언트로부터의 서비스 요구에 대해 빠르게 대응할 필요가 있는 서버는 슈퍼서버 경유가 아니라 서버 프로그램을 자신이 서비스 요구를 감시해야 한다. (이것을 stand alone이라고 한다 ) WEB 서버나 메일 서버가 이것에 해당한다. FTP 서버나 Telnet 서버 등 접속의 빈도가 높지 않은 서버는 슈퍼서버를 경유한 접속을 이용하는 것이 바람직하다.

     

    슈퍼 서버에는 inetd와 xinetd 가 있다. 각각 설정 방법이 많이 다르다. 

    하지만 대체로 디스트리뷰션 대부분 xinetd가 채용되어 있다.

    inetd의 설정

    inetd의 설정은 /etc/inetd.conf 파일에서 실시한다. 1행에 따라 하나의 서비스를 프로토콜에 나눠 기록한다. 

    /etc/inetd.conf의 각 필드의 의미를 알아보자면 아래와 같다.

    필드명 설명
    service_name /etc/services에 정의되어 있는 서비스 명
    socket_type 소켓타입 ( TCP는 stream UDMP는 dgram )
    protocol 프로토콜( 대부분 tcp, udp )
    flag 서비스 요구시에 처리방법 ( wait 인가 nowait 인가 )
        wait : 하나의 요구의 처리가 끝날때 까지 대기
        nowait : 대기 없이 다음 요구를 처리
    user 서비스를 실행하는 유저 명
    program 서버 프로그램 ( 데몬 )의 full path, TCP Wrapper 경유의 기동일 경우 [tcpd]
    args 서버 프로그램 ( 데몬 )에 넘기는 파라메터

    행의 맨 앞에 #이 있는 경우 코멘트이다. 보통 이용하는 필요가 없는 서비스에 대해서 행의 맨 앞에 #을 붙여 코멘트 아웃한다. 코멘트 아웃된 서비스는 inetd로부터 기동 되지 않게 된다. 이용하지 않는 서비스는 기동되지 않는 것이 원칙이다. 불필요한 서비스를 정지하는 것보다 세큐리티를 높일 수 있다. 

    /etc/inetd.conf의 변경을 행한 경우에는 inetd를 재기동할 필요가 있다 재기 동시에는 다음의 커맨드 중 하나를 이용하면 된다.

     

    • kill -HUP inetd의 PID
    • killall HUP inetd
    • /etc/init.d/inetd restart
    참고
    inetd, xinetd 경유로 기동 되는 타입의 서버 데몬의 이름에는 [in.]이 붙게 된다. 예를 들면 telnetd의 경우에는 in.telnetd가 된다.
    참고 2
    최근에는 inetd가 금지되고 xinetd만 사용하는 디스트리뷰션이 대부분이다. 또한 systemd가 xinetd의 기능을 대신하는 것도 있으며 기본적으로 xinetd가 인스톨되어있지 않은 디스트리뷰션도 많다.

    TCP Wrapper에 대한 접근 제어

    네트워크 서비스의 접속 제어를 집중적으로 행하기 위해선 TCP Wrapper를 사용한다. TCP Wrapper 데몬에 있는 tcpd 데몬은 telnetd나 ftpd 등의 서버 프로그램에 대신하여 서비스 요구를 받아들인 후 설정에 의거하여 체크를 실시하고 접속 허가된 경우 그에 해당하는 서버 프로그램에 처리를 넘긴다. 설정 파일은 /etc/hosts.allow 또는 /etc/hosts.deny이다.

     

    inetd 자체는 접근제어 기능을 가지고 있지 않다. 여기서 inetd는 tcpd와 연계되어 동작한다. inetd는 서비스 요구를 받아들이면, 그것을 tcpd ( TCP Wrapper의 프로그램 본체 )에 넘긴다. tcpd는 접근제어의 설정 파일인 /etc/hosts.allow와 /etc/hosts.deny를 조사한 후 서비스 요구를 허가할 것인가 거절할 것인가를 결정한다. 허가가 된 경우 tcpd는 대응하는 서버 프로그램을 기동하여 제어를 넘긴다.

     

    또한 TCP Wrapper 라이브러리인 libwrap을 이용하고 있는 애플리케이션은 tcpd 없이도 TCP Wrapper의 기능을 이용할 수 있다. Open SSH 서버, 각종 POP/IMAP서버 등이 libwrap를 이용하고 있다.

     

    /etc/hosts.allow와 /etc/hosts.deny

    TCP Wrapper는 우선 /etc/hosts.allow를 체크한 후 파일에 기록되어 있는 조건에 만족한다면 그 시점에서 접근을 허가한다. 이 경우 /etc/hosts.deny파일은 참조하지 않는다.

    /etc/hosts.allow에 부합하는 조검이 없다면 다음에 /etc/hosts.deny를 체크한다. 해당 파일에 기록된 조건에 부합할 경우에는 해당 시점에서 접근이 거부된다. 조거네 매치하지 않을 경우 접근이 허가된다. 이것들의 파일에는 다음과 같은 형식으로 조건이 기록된다.

     

    서비스명 : 대상 호스트의 리스트

     

    서비스 명에는 /etc/inetd.conf의 최초의 필드에 지정되어 있는 것을, 대상 호스트에는 호스트명, 도메인명, IP주소의 범위를 기록한다. 설정에는 아래에 나오는 와일드카드 지정을 사용할 수 있다.

     

    와일드카드 설명
    ALL 모든 서비스또는 호스트
    A EXCEPT B B이외의 A
    LOCAL [.] 을 포함하지 않은 모든 호스트 ( 즉 로컬 네트워크 세그먼트 내의 호스트 )
    PARANOID 호스트명으로부터 DNS검색한 주소와 서비스 요구처 주소가 불일치 

     

    /etc/hosts.allow의 설정은 /etc/hosts.deny의 설정보다 먼저 읽히기 때문에 /etc/hosts.deny에 모든 접근을 금지시킨 후에 /etc/hosts.allow에 허가 대상만 기록하는 방법이 일반적이다. 어느 쪽이든 기록되어 있지 않은 호스트는 허가된다.

    참고
    /etc/hosts.allow, /etc/hosts.deny 어느쪽이든 파일이 변경된 경우 시스템이나 네트워크 서비스를 재기동하지 않더라도 변경은 유효하다.

     

    xinetd의 설정

    최근에 들어선 inetd 보다 더 상세하게 설정이 가능한 슈퍼 서버로서 xinetd가 사용되고 있는 경우가 많다. xinetd에서는 서비스별로 접근 제어를 상세하게 설정할 수 있다.

    xinetd의 설정은 전반적인 설정을 하는 /etc/xinetd.conf 파일과 xinetd.d 디렉터리 (보통의 경우 /etc/xinetd.d) 이하에 서비스 별로 설정 파일이 구성되어 있다. /etc/xinetd.conf 파일에 사용되는 주요한 파라메터는 아래와 같다.

     

    파라메터 설명
    instances 각 서비스의 최대 데몬 수
    log_type 로그의 출력 방법
    log_on_success 접속을 허가한 경우에 로그에 기록되는 내용
    log_on_failure 접속을 거부 당했을 경우 로그에 기록되는 내용
    cps 1초단위로 접속 가능한 최대 커넥션수와 한도에 도달했을 경우 서비스를 정지시키는 시간
    includedir 서비스별로 설정 파일을 참고하는 디렉토리

    /etc/xined.d 디렉터리 이하에 있는 설정 파일은 ftp나 telnet등 서비스명이 파일명이 되어 있다. 이것들의 파일로 서비스별로 설정을 행한다. 즉 /etc/inetd.conf에서는 1행에 기록되어있는 것을 xinetd에서는 1파일에 기록하도록 된다. 설정을 변경한 경우 xinetd의 재기동이 필요하다. /etc/xinetd.d 디렉토리 이하에 있는 설정 파일에 사용하는 주요한 파라미터는 아래와 같다.

     

    파라메터 설명
    disable 서비스의 유효/무효 ( no로 유효 )
    socket_type 통신 타입 ( TCP는 stream, UDP는 dgram )
    wait 대기 시간
    user 서비스를 실행하는 유저명
    server 서버 프로그램( 데몬) 의 full path
    server_args 서버 프로그램 (데몬)ㅔ 전달하는 인수
    log_on_failure 접속이 거절당했을 경우 로그에 남기는 내용
    nice 실행 우선도
    only_from 접속을 허가하는 접속처
    no_access 접속을 거부하는 접속처
    access_times 접근을 허가하는 시간대

    열려있는 포트 확인

    서버 프로세스를 기동 하면 해당 프로세스는 특정의 포트를 열어 접속을 대기하고 있다. 공격자는 열려있는 포트를 알면 외부로부터 해당 포트에 접속하여 정보를 취득하거나 공격하는 것이 가능하다. 따라서 열려있는 포트는 최소한으로 정리할 필요가 있다. 불필요한 포트가 열려있다 ( 불필요한 서비스가 동작하고 있다)는 것은 그만큼 세큐리티 리스크가 높다 라고 할 수 있다. 열려 있는 포트를 확인하기 위해서는 netstat 커맨드나 lsof 커맨드가 사용된다.

     

    lsof 커맨드에서 자주 사용되는 옵션은 아래와 같다.

    옵션 설명
    -i  열려있는 포트정보를 표시한다.
    -i 포트번호 지정한 포트번호가 사용되고 있는 통신을 표시한다.

    공격자가 네트워크를 경유하여 열려있는 포트를 확인하는 행위를 호트 스캔이라고 한다. 일반적인 포트스캔은 공격의 사전조사로서 행하고 있지만, 리모트 호스트로 열려있는 포트를 확인하기 위해서 이용한다. nmap 커맨드로 포트 스캔을 할 수 있다.

     

    nmap 대상 호스트

     

    포트를 열고 있는 프로세스를 특정하기 위해서 fuser 커맨드도 사용된다. 

     

    SUID가 설정되어있는 파일

    소유자가 root유저인 프로그램에 SUID를 설정하면 일반 유저가 실행할 경우에도 해당 프로그램은 root 권한으로 동작한다.  하지만 불필요한 SUID를 설정해버리면 해당 파일을 이용하여 root 권한을 취득한 뒤 본래는 root 유저만 허가되는 조작을 일반 유저가 행할 가능성이 있다. 이 때문에 SUID가 설정되어 있는 파일을 파악해두어 변경이 없는지 정기적으로 체크할 필요가 있다. 또한 SUID를 설정하는 파일은 최소한으로 간추릴 필요가 있다. 변경한 기억이 없는 파일에 SUID가 설정되어 있을 경우 시스템이 피해를 받았을 가능성이 있다.

     

    SUID가 설정되어있는 파일을 검색하기 위해선 아래의 커맨드가 사용된다.

     

    find / -perm -u+s -ls

     

    이것은 모든 파일 시스템으로부터 SUID가 설정되어있는 파일을 검색하여 표시해준다. 이 작업을 정기적으로 행하는 것으로 파일에 대한 불필요한 변경이 있는지 없는지 확인할 수 있다.

    같은 방법으로 [-u+s] 대신에 [-g+s]를 지정하면 SGID가 설정되어 있는 파일을 [-o+t]를 지정하면 스티키 비트가 설정되어 있는 파일을 검색할 수 있다. 

    반응형

    'Technique > LPIC' 카테고리의 다른 글

    Open SSH  (0) 2019.11.13
    유저에 관한 세큐리티 관리  (0) 2019.11.11
    DNS 설정  (0) 2019.11.11
    네트워크의 트러블 슈팅  (0) 2019.11.10
    네트워크의 설정  (0) 2019.11.10

    댓글

Designed by Tistory.