확장 권한 정책은 응용 프로그램에 대한 공격이 성공한 경우 시스템에 대한 공격자 액세스를 제한할 수 있습니다. 확장 정책 규칙은 권한 지정의 영향 범위를 규칙에 포함된 리소스로만 제한합니다. 확장 정책 규칙은 권한을 중괄호로 묶고 뒤에 콜론 및 관련 리소스를 추가하여 표현합니다. 자세한 내용은 사용자 또는 역할의 권한 확장을 참조하십시오. 구문의 예는 ppriv(1) 및 privileges(5) 매뉴얼 페이지를 참조하십시오.
관리자와 일반 사용자 모두 확장 권한을 사용하여 리소스를 잠글 수 있습니다. 관리자는 사용자, 포트 및 응용 프로그램에 대한 확장 권한 규칙을 만들 수 있습니다. 일반 사용자는 명령줄을 사용하거나 ppriv -r 명령을 사용하는 스크립트를 작성하여 응용 프로그램이 사용자 지정 디렉토리 외부에 파일을 쓰지 못하도록 할 수 있습니다.
진입하는 악의적인 사용자가 사용할 수 있는 액세스를 포트로 제한 – 확장 권한 정책을 포트에 적용하는 방법
root가 아닌 데몬으로 데이터베이스 실행 – MySQL 서비스를 잠그는 방법
root가 아닌 데몬으로 Apache 웹 서버 실행 – Apache 웹 서버에 특정 권한을 지정하는 방법
Apache 웹 서버가 권한을 사용하여 실행 중인지 확인 – Apache 웹 서버에서 사용 중인 권한을 확인하는 방법
Firefox가 시스템의 디렉토리에 쓰지 못하도록 금지 – Example 4–4
응용 프로그램을 시스템의 특정 디렉토리로 제한 – Example 4–5
NTP(Network Time Protocol) 서비스는 udp 트래픽에 대해 권한 있는 포트 123을 사용합니다. 이 서비스를 실행하려면 권한이 필요합니다. 이 절차 예에서는 서비스 매니페스트를 수정하여 이 포트에 지정된 권한을 얻었을 수도 있는 악의적인 사용자가 다른 포트에 액세스하지 못하도록 보호합니다.
시작하기 전에
root 역할을 맡아야 합니다. 자세한 내용은 지정된 관리 권한 사용을 참조하십시오.
다음 /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에만 바인딩할 수 있습니다.
해커가 서비스를 악용하여 다른 프로세스를 시작할 수 있는 경우 해당 프로세스도 유사하게 제한됩니다.
# svccfg -s ntp editprop
확장 권한 정책은 지정된 권한 및 지정되지 않은 기본 권한을 제외한 모든 권한을 이 서비스에서 제거합니다. 따라서 잠재적으로 악용 가능한 80개 이상의 권한 세트가 8개 미만으로 줄어듭니다.
# svcadm restart ntp
# 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 데이터베이스는 보호되지 않은 포트를 통해 root의 전체 권한으로 실행되도록 구성됩니다. 이 작업에서는 권한(right) 프로파일을 통해 MySQL 서비스에 확장 권한(privilege) 정책을 지정합니다. 권한 프로파일이 서비스의 exec 메소드가 되면 MySQL이 보호된 포트를 통해 사용자 mysql로 실행되고 비MySQL 프로세스에 의한 데이터베이스 액세스가 제한됩니다.
시작하기 전에
초기 사용자는 패키지를 설치할 수 있습니다. 나머지 단계는 root 역할이 수행해야 합니다. 자세한 내용은 지정된 관리 권한 사용을 참조하십시오.
# pkg search basename:mysql ... basename ... pkg:/database/mysql-51@version # pfexec pkg install mysql-51
# svcs mysql STATE STIME FMRI disabled May_15 svc:/application/database/mysql:version_51
이 서비스에 대한 서비스 매니페스트는 실행 메소드를 셸 스크립트 래퍼 /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 권한은 기본적으로 모든 프로세스에 부여되는 기본 권한입니다. 쓰기 가능 경로를 명시적으로 열거하면 쓰기 액세스가 해당 경로로만 제한됩니다. 이 제약 조건은 지정한 실행 파일 및 자식 프로세스에 적용됩니다.
# ipadm set-prop -p extra_priv_ports+=3306 tcp # ipadm 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에 바인딩할 때는 일반적으로 이 권한이 필요하지 않습니다.
# 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
FMRI의 마지막 구성 요소인 mysql:version_51은 서비스를 고유하게 지정하는 데 충분합니다.
# svcadm enable mysql:version_5
# 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
이 절차에서는 필요한 권한만 지정하여 웹 서버 데몬을 잠급니다. 웹 서버는 포트 80에만 바인딩할 수 있으며 webservd 데몬이 소유한 파일에만 쓸 수 있습니다. root로 실행되는 apache22 서비스 프로세스는 없습니다.
시작하기 전에
root 역할을 맡아야 합니다. 자세한 내용은 지정된 관리 권한 사용을 참조하십시오.
# 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
# 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 웹 서버를 구성하는 방법에서 설명합니다.
# 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 프로파일이 사용됩니다.
# svcadm enable apache22
브라우저를 열고 Firefox URL 필드에 localhost를 입력합니다.
다음 단계
권한이 올바르게 적용되었는지 확인하려면 Apache 웹 서버에서 사용 중인 권한을 확인하는 방법을 계속합니다.
이 작업에서는 Apache2 권한(right) 프로파일의 디버그 버전을 만들어 웹 서버에서 사용 중인 권한(privilege)을 확인합니다.
시작하기 전에
Apache 웹 서버에 특정 권한을 지정하는 방법을 완료했습니다. apache22 서비스가 사용 안함으로 설정되었습니다. root 역할을 맡고 있습니다.
명령 디버그는 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) 매뉴얼 페이지를 참조하십시오.
# usermod -K profiles+=Apache-debug webservd
# su - webservd
# id uid=80(webservd) gid=80(webservd)
SMF를 직접 사용하지 마십시오. Apache-debug 권한 프로파일에 명령을 사용합니다.
% pfbash # ppriv -De /usr/apache2/2.2/bin/apachectl start
# 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