Oracle® Solaris 11.2의 사용자 및 프로세스 보안

인쇄 보기 종료

업데이트 날짜: 2014년 7월
 
 

확장 권한을 사용하여 리소스 잠금

확장 권한 정책은 응용 프로그램에 대한 공격이 성공한 경우 시스템에 대한 공격자 액세스를 제한할 수 있습니다. 확장 정책 규칙은 권한 지정의 영향 범위를 규칙에 포함된 리소스로만 제한합니다. 확장 정책 규칙은 권한을 중괄호로 묶고 뒤에 콜론 및 관련 리소스를 추가하여 표현합니다. 자세한 내용은 사용자 또는 역할의 권한 확장을 참조하십시오. 구문의 예는 ppriv(1)privileges(5) 매뉴얼 페이지를 참조하십시오.

관리자와 일반 사용자 모두 확장 권한을 사용하여 리소스를 잠글 수 있습니다. 관리자는 사용자, 포트 및 응용 프로그램에 대한 확장 권한 규칙을 만들 수 있습니다. 일반 사용자는 명령줄을 사용하거나 ppriv -r 명령을 사용하는 스크립트를 작성하여 응용 프로그램이 사용자 지정 디렉토리 외부에 파일을 쓰지 못하도록 할 수 있습니다.

확장 권한 정책을 포트에 적용하는 방법

NTP(Network Time Protocol) 서비스는 udp 트래픽에 대해 권한 있는 포트 123을 사용합니다. 이 서비스를 실행하려면 권한이 필요합니다. 이 절차 예에서는 서비스 매니페스트를 수정하여 이 포트에 지정된 권한을 얻었을 수도 있는 악의적인 사용자가 다른 포트에 액세스하지 못하도록 보호합니다.

시작하기 전에

root 역할을 맡아야 합니다. 자세한 내용은 지정된 관리 권한 사용을 참조하십시오.

  1. 포트에 대한 기본 서비스 매니페스트 항목을 읽습니다.

    다음 /lib/svc/manifest/network/ntp.xml start 메소드 항목에서 net_privaddr, proc_lock_memory 및 sys_time 권한은 다른 프로세스에서 사용할 수 있습니다.

    privileges='basic,!file_link_any,!proc_info,!proc_session,net_privaddr,
    proc_lock_memory,sys_time'

    !file_link_any,!proc_info,!proc_session에서 지정한 제거된 권한은 서비스가 다른 프로세스를 관찰하거나 신호를 보낼 수 없도록 방지하고 파일 이름 바꾸기 방식으로 하드 링크를 만들지 못하도록 방지합니다. 즉, 서비스로 시작된 프로세스는 다른 권한 있는 포트가 아니라 NTP 포트인 123에만 바인딩할 수 있습니다.

    해커가 서비스를 악용하여 다른 프로세스를 시작할 수 있는 경우 해당 프로세스도 유사하게 제한됩니다.

  2. startrestart 메소드를 수정하여 net_privaddr 권한을 이 포트로만 제한합니다.
    # svccfg -s ntp editprop
    1. net_privaddr 문자열을 검색합니다.
    2. net_privaddr이 포함된 항목의 주석 처리를 해제합니다.
    3. 두 항목에서 모두 net_privaddr{net_privaddr}:123/udp로 바꿉니다.

      확장 권한 정책은 지정된 권한 및 지정되지 않은 기본 권한을 제외한 모든 권한을 이 서비스에서 제거합니다. 따라서 잠재적으로 악용 가능한 80개 이상의 권한 세트가 8개 미만으로 줄어듭니다.

  3. 확장 권한 정책을 사용하려면 서비스를 다시 시작합니다.
    # svcadm restart ntp
  4. 서비스가 확장 권한을 사용 중인지 확인합니다.
    # svccfg -s ntp listprop | grep privileges
    start/privileges    astring  basic,!file_link_any,!proc_info,!proc_session,
                        {net_privaddr}:123/udp,proc_lock_memory,sys_time
    restart/privileges  astring  basic,!file_link_any,!proc_info,!proc_session,
                        {net_privaddr}:123/udp,proc_lock_memory,sys_time
    

MySQL 서비스를 잠그는 방법

설치 시 MySQL 데이터베이스는 보호되지 않은 포트를 통해 root의 전체 권한으로 실행되도록 구성됩니다. 이 작업에서는 권한(right) 프로파일을 통해 MySQL 서비스에 확장 권한(privilege) 정책을 지정합니다. 권한 프로파일이 서비스의 exec 메소드가 되면 MySQL이 보호된 포트를 통해 사용자 mysql로 실행되고 비MySQL 프로세스에 의한 데이터베이스 액세스가 제한됩니다.

시작하기 전에

초기 사용자는 패키지를 설치할 수 있습니다. 나머지 단계는 root 역할이 수행해야 합니다. 자세한 내용은 지정된 관리 권한 사용을 참조하십시오.

  1. MySQL 패키지를 설치합니다.
    # pkg search basename:mysql
    ...
    basename ... pkg:/database/mysql-51@version
    # pfexec pkg install mysql-51

    주 - MySQL 데이터베이스 버전 5.5로 업그레이드하는 경우 5.151 대신 5.555를 사용하도록 모든 단계를 수정합니다.
  2. MySQL 서비스의 FMRI 및 상태를 표시합니다.
    # svcs mysql
    STATE          STIME    FMRI
    disabled       May_15   svc:/application/database/mysql:version_51
  3. 서비스의 실행 메소드를 수정하는 권한 프로파일을 만듭니다.

    이 서비스에 대한 서비스 매니페스트는 실행 메소드를 셸 스크립트 래퍼 /lib/svc/method/mysql_51로 지정합니다.

    # svccfg -s mysql listprop | grep manifest
    ... astring     /lib/svc/manifest/application/database/mysql_51.xml
    # grep exec= /lib/svc/manifest/application/database/mysql_51.xml
                    exec='/lib/svc/method/mysql_51 start'
                    exec='/lib/svc/method/mysql_51 stop'
    

    프로파일의 명령에 /lib/svc/method/mysql_51 래퍼를 사용합니다.

    % su -
    Password: xxxxxxxx
    # profiles -p "MySQL Service"
    MySQL Service> set desc="Locking down the MySQL Service"
    MySQL Service> add cmd=/lib/svc/method/mysql_51
    MySQL Service:mysql_51> set privs=basic
    MySQL Service:mysql_51> add privs={net_privaddr}:3306/tcp
    MySQL Service:mysql_51> add privs={file_write}:/var/mysql/5.1/data/*
    MySQL Service:mysql_51> add privs={file_write}:/tmp/mysql.sock
    MySQL Service:mysql_51> add privs={file_write}:/var/tmp/ib*
    MySQL Service:mysql_51> end
    MySQL Service> set uid=mysql
    MySQL Service> set gid=mysql
    MySQL Service> exit

    file_write 권한은 기본적으로 모든 프로세스에 부여되는 기본 권한입니다. 쓰기 가능 경로를 명시적으로 열거하면 쓰기 액세스가 해당 경로로만 제한됩니다. 이 제약 조건은 지정한 실행 파일 및 자식 프로세스에 적용됩니다.

  4. MySQL의 기본 포트를 권한 있는 포트로 만듭니다.
    # ipadm set-prop -p extra_priv_ports+=3306 tcpipadm show-prop -p extra_priv_ports tcp
    PROTO PROPERTY            PERM CURRENT     PERSISTENT   DEFAULT    POSSIBLE
    tcp   extra_priv_ports    rw   2049,4045,  3306         2049,4045  1-65535
                                     3306

    권한 있는 포트에 바인딩하려면 net_privaddr 권한이 필요합니다. MySQL의 경우 기본 포트 번호 3306에 바인딩할 때는 일반적으로 이 권한이 필요하지 않습니다.

  5. MySQL 서비스에 권한 프로파일을 지정하고 서비스에서 사용하도록 지시합니다.
    # svccfg -s mysql:version_51
    ...version_51> setprop method_context/profile="MySQLService"
    ...version_51> setprop method_context/use_profile=true
    ...version_51> refresh
    ...version_51> exit
  6. 서비스를 사용으로 설정합니다.

    FMRI의 마지막 구성 요소인 mysql:version_51은 서비스를 고유하게 지정하는 데 충분합니다.

    svcadm enable mysql:version_5
  7. (옵션) 서비스가 MySQL Service 권한 프로파일에 지정된 권한으로 실행되고 있는지 확인합니다.
    # ppriv $(pgrep mysql)
    103697:   /usr/mysql/5.1/bin/mysqld --basedir=/usr/mysql/5.1 
                                        --datadir=/var/mysql/5.1/data
    flags =   PRIV_XPOLICY
        Extended policies: 
                 {net_privaddr}:3306/tcp   
                 {file_write}:/var/mysql/5.1/data/*
                 {file_write}:/tmp/mysql.sock  
                 {file_write}:/var/tmp/ib*
            E: basic,!file_write
            I: basic,!file_write
            P: basic,!file_write
            L: all
    103609:  /bin/sh /usr/mysql/5.1/bin/mysqld_safe --user=mysql 
                                   --datadir=/var/mysql/5.1/data
    flags =  PRIV_XPOLICY
        Extended policies:
                 {net_privaddr}:3306/tcp
                 {file_write}:/var/mysql/5.1/data/*
                 {file_write}:/tmp/mysql.sock
                 {file_write}:/var/tmp/ib*
            E: basic,!file_write       
            I: basic,!file_write       
            P: basic,!file_write       
            L: all

Apache 웹 서버에 특정 권한을 지정하는 방법

이 절차에서는 필요한 권한만 지정하여 웹 서버 데몬을 잠급니다. 웹 서버는 포트 80에만 바인딩할 수 있으며 webservd 데몬이 소유한 파일에만 쓸 수 있습니다. root로 실행되는 apache22 서비스 프로세스는 없습니다.

시작하기 전에

root 역할을 맡아야 합니다. 자세한 내용은 지정된 관리 권한 사용을 참조하십시오.

  1. Web Server 권한 프로파일을 만듭니다.
    # profiles -p "Apache2"
    profiles:Apache2> set desc="Apache Web Server Extended Privilege"
    profiles:Apache2> add cmd=/lib/svc/method/http-apache22
    profiles:Apache2:http-apache22> add privs={net_privaddr}:80/tcp
    ...http-apache22> add privs={zone}:/system/volatile/apache2
    ...http-apache22> add privs={zone}:/var/apache2/2.2/logs/*
    ...http-apache22> add privs={zone}:/var/user
    ...http-apache22> add privs={file_write}:/var/user/webserv*
    ...http-apache22> add privs={file_write}:/tmp/*
    ...http-apache22> add privs={file_write}:/system/volatile/apache*
    ...http-apache22> add privs={file_write}:/proc/*
    ...http-apache22> add privs=basic,proc_priocntl
    ...http-apache22> set uid=webservd
    ...http-apache22> set gid=webservd
    ...http-apache22> end
    ---Apache2> exit
  2. (옵션) Apache2와 함께 SSL 커널 프록시를 사용 중인 경우 webservd 확장 정책에 SSL 포트를 추가해야 합니다.
    # profiles -p "Apache2"
    profiles:Apache2> add privs={net_privaddr}:443/tcp
    profiles:Apache2> add privs={net_privaddr}:8443/tcp
    profiles:Apache2:http-apache22> end

    SSL 커널 프록시 절차는 Oracle Solaris 11.2의 네트워크 보안 의 SSL 커널 프록시를 사용하도록 Apache 2.2 웹 서버를 구성하는 방법에서 설명합니다.

  3. apache22 SMF 시작 메소드에 권한 프로파일을 추가합니다.
    # svccfg -s apache22
    svc:/network/http:Apache2> listprop start/exec
    start/exec	 astring	"/lib/svc/method/http-apache22 start"
    ...
    svc:/network/http:Apache2> setprop start/profile="Apache2"
    svc:/network/http:Apache2> setprop start/use_profile=true
    svc:/network/http:Apache2> refresh
    svc:/network/http:Apache2> exit

    apache22 서비스가 사용으로 설정된 경우 Apache2 프로파일이 사용됩니다.

  4. apache22 서비스를 사용으로 설정합니다.
    # svcadm enable apache22
  5. 웹 서버가 작동 중인지 확인합니다.

    브라우저를 열고 Firefox URL 필드에 localhost를 입력합니다.

다음 단계

권한이 올바르게 적용되었는지 확인하려면 Apache 웹 서버에서 사용 중인 권한을 확인하는 방법을 계속합니다.

Apache 웹 서버에서 사용 중인 권한을 확인하는 방법

이 작업에서는 Apache2 권한(right) 프로파일의 디버그 버전을 만들어 웹 서버에서 사용 중인 권한(privilege)을 확인합니다.

시작하기 전에

Apache 웹 서버에 특정 권한을 지정하는 방법을 완료했습니다. apache22 서비스가 사용 안함으로 설정되었습니다. root 역할을 맡고 있습니다.

  1. Apache2 프로파일을 복제하여 다른 명령을 호출합니다.

    명령 디버그는 SMF 서비스 디버그보다 더 간단합니다. apachectl 명령은 Apache 서비스를 대화식으로 시작합니다.

    # profiles -p "Apache2"
    profiles:Apache2> set name="Apache-debug"
    profiles:Apache-debug> sel <Tab><Tab>
    profiles:Apache-debug:http-apache22> set id=/usr/apache2/2.2/bin/apachectl
    profiles:Apache-debug:apachectl> end
    profiles:Apache-debug> exit

    자세한 내용은 apachectl(8) 매뉴얼 페이지를 참조하십시오.

  2. 복제된 프로파일을 webservd 계정에 지정합니다.
    # usermod -K profiles+=Apache-debug webservd
  3. webservd ID로 전환합니다.
    # su - webservd
  4. (옵션) ID를 확인합니다.
    # id   
    uid=80(webservd) gid=80(webservd)
  5. 프로파일 셸에서 디버그 모드로 웹 서비스를 시작합니다.

    SMF를 직접 사용하지 마십시오. Apache-debug 권한 프로파일에 명령을 사용합니다.

    % pfbash
    # ppriv -De /usr/apache2/2.2/bin/apachectl start
  6. root 역할에서 첫번째 http 데몬의 권한을 검사합니다.
    # ppriv $(pgrep httpd|head -1)
    2999:   httpd
    flags = PRIV_DEBUG|PRIV_XPOLICY|PRIV_EXEC
      5         Extended policies:
      6                 {net_privaddr}:80/tcp
      7                 {zone}:/system/volatile/apache2
      8                 {zone}:/var/apache2/2.2/logs/*
      9                 {zone}:/var/user
     10                 {file_write}:/var/user/webserv*
     11                 {file_write}:/tmp/*
     12                 {file_write}:/system/volatile/apache*
     13                 {file_write}:/proc/*
     14         E: basic,!file_write,!proc_info,proc_priocntl
     15         I: basic,!file_write,!proc_info,proc_priocntl
     16         P: basic,!file_write,!proc_info,proc_priocntl
     17         L: all