13.4. 설정 예
다음 예제에서는 SELinux가 Apache HTTP 서버를 보완하는 방법과 Apache HTTP Server의 전체 기능을 유지 관리하는 방법을 보여주는 실제 데모를 제공합니다.
13.4.1. 정적 사이트 실행 링크 복사링크가 클립보드에 복사되었습니다!
링크 복사링크가 클립보드에 복사되었습니다!
정적 웹 사이트를 생성하려면 해당 웹 사이트의
.html 파일에 httpd_sys_content_t 유형의 레이블을 지정합니다. 기본적으로 Apache HTTP 서버는 httpd_sys_content_t 유형으로 레이블이 지정된 파일에 쓸 수 없습니다. 다음 예제에서는 읽기 전용 웹 사이트에 대한 파일을 저장할 새 디렉터리를 생성합니다.
- root
로Cryostat 유틸리티를 사용하여 최상위 디렉토리를 생성합니다.mkdir /mywebsite
~]# mkdir /mywebsiteCopy to Clipboard Copied! Toggle word wrap Toggle overflow - root 로서
/mywebsite/index.html파일을 만듭니다. 다음 콘텐츠를 복사하여/mywebsite/index.html에 붙여넣습니다.<html> <h2>index.html from /mywebsite/</h2> </html>
<html> <h2>index.html from /mywebsite/</h2> </html>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Apache HTTP Server가
/mywebsite/및 그 아래의 파일 및 하위 디렉터리에 대한 읽기 전용 액세스만 허용하려면httpd_sys_content_t유형의 디렉터리에 레이블을 지정합니다. root로 다음 명령을 입력하여 레이블 변경 사항을 파일 컨텍스트 구성에 추가합니다.semanage fcontext -a -t httpd_sys_content_t "/mywebsite(/.*)?"
~]# semanage fcontext -a -t httpd_sys_content_t "/mywebsite(/.*)?"Copy to Clipboard Copied! Toggle word wrap Toggle overflow restorecon유틸리티를 root로 사용하여 레이블을 변경합니다.restorecon -R -v /mywebsite
~]# restorecon -R -v /mywebsite restorecon reset /mywebsite context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0 restorecon reset /mywebsite/index.html context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 이 예에서는
/etc/httpd/conf/httpd.conf파일을 root로 편집합니다. 기존DocumentRoot옵션을 주석 처리합니다.DocumentRoot "/mywebsite"옵션을 추가합니다. 편집 후 이러한 옵션은 다음과 같이 표시됩니다.#DocumentRoot "/var/www/html" DocumentRoot "/mywebsite"
#DocumentRoot "/var/www/html" DocumentRoot "/mywebsite"Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root로 다음 명령을 입력하여 Apache HTTP Server의 상태를 확인합니다. 서버가 중지되면 시작합니다.
systemctl status httpd.service
~]# systemctl status httpd.service httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled) Active: inactive (dead)Copy to Clipboard Copied! Toggle word wrap Toggle overflow systemctl start httpd.service
~]# systemctl start httpd.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 서버가 실행 중인 경우 root로 다음 명령을 실행하여 서비스를 다시 시작합니다(httpd.conf에 대한 변경 사항도 적용됨).systemctl status httpd.service
~]# systemctl status httpd.service httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled) Active: active (running) since Wed 2014-02-05 13:16:46 CET; 2s agoCopy to Clipboard Copied! Toggle word wrap Toggle overflow systemctl restart httpd.service
~]# systemctl restart httpd.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 웹 브라우저를 사용하여
http://localhost/index.html로 이동합니다. 다음은 다음과 같습니다.index.html from /mywebsite/
index.html from /mywebsite/Copy to Clipboard Copied! Toggle word wrap Toggle overflow
13.4.2. NFS 및 CIFS 볼륨 공유 링크 복사링크가 클립보드에 복사되었습니다!
링크 복사링크가 클립보드에 복사되었습니다!
기본적으로 클라이언트쪽의 NFS 마운트는 NFS 볼륨의 정책에서 정의한 기본 컨텍스트로 레이블이 지정됩니다. 일반적인 정책에서 이 기본 컨텍스트는
nfs_t 유형을 사용합니다. 또한 기본적으로 클라이언트측에 마운트된 Samba 공유는 정책에서 정의한 기본 컨텍스트로 레이블이 지정됩니다. 일반적인 정책에서 이 기본 컨텍스트는 cifs_t 유형을 사용합니다.
정책 구성에 따라 서비스에서
nfs_t 또는 cifs_t 유형으로 레이블이 지정된 파일을 읽지 못할 수 있습니다. 이렇게 하면 이러한 유형으로 레이블이 지정된 파일 시스템이 마운트되지 않고 다른 서비스에서 읽거나 내보내지 못하게 할 수 있습니다. 부울을 활성화하거나 비활성화하여 nfs_t 및 cifs_t 유형에 액세스할 수 있는 서비스를 제어할 수 있습니다.
httpd_use_nfs 부울을 활성화하여 httpd 가 NFS 볼륨( nfs_t 유형으로 레이블이 지정된)에 액세스하고 공유할 수 있도록 합니다.
setsebool -P httpd_use_nfs on
~]# setsebool -P httpd_use_nfs on
httpd_use_cifs 부울을 활성화하여 httpd 가 CIFS 볼륨에 액세스하고 공유할 수 있도록 합니다( cifs_t 유형으로 레이블이 지정됨).
setsebool -P httpd_use_cifs on
~]# setsebool -P httpd_use_cifs on
참고
setsebool 변경 사항을 재부팅해도 유지하지 않으려면
-P 옵션을 사용하지 마십시오.
13.4.3. 서비스 간 파일 공유 링크 복사링크가 클립보드에 복사되었습니다!
링크 복사링크가 클립보드에 복사되었습니다!
type Enforcement를 사용하면 프로세스가 다른 프로세스에서 사용할 파일에 액세스하는 것을 방지할 수 있습니다. 예를 들어 기본적으로 Samba는 Apache HTTP Server에서 사용하기 위한
httpd_sys_content_t 유형으로 레이블이 지정된 파일을 읽을 수 없습니다. 필요한 파일에 public_content_t 또는 public_content_rw_t 유형으로 레이블이 지정된 경우 Apache HTTP Server, FTP, rsync 및 Samba 간에 파일을 공유할 수 있습니다.
다음 예제에서는 디렉터리와 파일을 만들고 Apache HTTP 서버, FTP, rsync 및 Samba를 통해 해당 디렉토리와 파일을 공유(읽기 전용)할 수 있습니다.
- root
로Cryostat 유틸리티를 사용하여 여러 서비스 간에 파일을 공유할 새 최상위 디렉토리를 만듭니다.mkdir /shares
~]# mkdir /sharesCopy to Clipboard Copied! Toggle word wrap Toggle overflow - file-context 구성의 패턴과 일치하지 않는 파일 및 디렉터리는
default_t유형으로 레이블을 지정할 수 있습니다. 이 유형은 제한된 서비스에 액세스할 수 없습니다.ls -dZ /shares
~]$ ls -dZ /shares drwxr-xr-x root root unconfined_u:object_r:default_t:s0 /sharesCopy to Clipboard Copied! Toggle word wrap Toggle overflow - root 로서
/shares/index.html파일을 만듭니다. 다음 콘텐츠를 복사하여/shares/index.html에 붙여넣습니다.Copy to Clipboard Copied! Toggle word wrap Toggle overflow public_content_t유형을 사용하여/shares/레이블을 지정하면 Apache HTTP Server, FTP, rsync 및 Samba의 읽기 전용 액세스를 허용합니다. root로 다음 명령을 입력하여 레이블 변경 사항을 파일 컨텍스트 구성에 추가합니다.semanage fcontext -a -t public_content_t "/shares(/.*)?"
~]# semanage fcontext -a -t public_content_t "/shares(/.*)?"Copy to Clipboard Copied! Toggle word wrap Toggle overflow restorecon유틸리티를 root로 사용하여 레이블 변경 사항을 적용합니다.restorecon -R -v /shares/
~]# restorecon -R -v /shares/ restorecon reset /shares context unconfined_u:object_r:default_t:s0->system_u:object_r:public_content_t:s0 restorecon reset /shares/index.html context unconfined_u:object_r:default_t:s0->system_u:object_r:public_content_t:s0Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Samba를 통해
/shares/ 를 공유하려면 다음을 수행합니다.
- samba, samba -common 및 samba-client 패키지가 설치되어 있는지 확인합니다(버전 번호가 다를 수 있음).
rpm -q samba samba-common samba-client
~]$ rpm -q samba samba-common samba-client samba-3.4.0-0.41.el6.3.i686 samba-common-3.4.0-0.41.el6.3.i686 samba-client-3.4.0-0.41.el6.3.i686Copy to Clipboard Copied! Toggle word wrap Toggle overflow 이러한 패키지가 설치되어 있지 않으면 root로 다음 명령을 실행하여 설치합니다.yum install package-name
~]# yum install package-nameCopy to Clipboard Copied! Toggle word wrap Toggle overflow /etc/samba/smb.conf파일을 root로 편집합니다. 이 파일 하단에 다음 항목을 추가하여 Samba를 통해/shares/디렉터리를 공유합니다.Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Samba 파일 시스템을 마운트하려면 Samba 계정이 필요합니다. root로 다음 명령을 입력하여 Samba 계정을 만듭니다. 여기서 username 은 기존 Linux 사용자입니다. 예를 들어 smbpasswd -a testuser 는 Linux
testuser사용자에 대한 Samba 계정을 생성합니다.smbpasswd -a testuser
~]# smbpasswd -a testuser New SMB password: Enter a password Retype new SMB password: Enter the same password again Added user testuser.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 위의 명령을 실행하여 시스템에 존재하지 않는 계정의 사용자 이름을 지정하면 '사용자 이름'! 오류에 대한 Unix 계정을찾을수 없습니다. - Samba 서비스를 시작합니다.
systemctl start smb.service
~]# systemctl start smb.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 다음 명령을 입력하여 사용 가능한 공유를 나열합니다. 여기서 username 은 3단계에 추가된 Samba 계정입니다. 암호를 입력하라는 메시지가 표시되면 3단계에서 Samba 계정에 할당된 암호를 입력합니다(버전 번호는 다를 수 있음).
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 새
디렉터리를 생성하는 사용자입니다. 이 디렉터리는공유 Samba 공유를마운트하는 데 사용됩니다.mkdir /test/
~]# mkdir /test/Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root로 다음 명령을 입력하여 공유 Samba
공유를/test/에 마운트하고 사용자 이름을 3단계에서 사용자 이름으로 바꿉니다.mount //localhost/shares /test/ -o user=username
~]# mount //localhost/shares /test/ -o user=usernameCopy to Clipboard Copied! Toggle word wrap Toggle overflow 3단계에 구성된 사용자 이름의 암호를 입력합니다. - Samba를 통해 공유되는 파일의 내용을 확인합니다.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Apache HTTP 서버를 통해
/shares/ 를 공유하려면 다음을 수행합니다.
- httpd 패키지가 설치되었는지 확인합니다 (버전 번호는 다를 수 있음).
rpm -q httpd
~]$ rpm -q httpd httpd-2.2.11-6.i386Copy to Clipboard Copied! Toggle word wrap Toggle overflow 이 패키지가 설치되지 않은 경우yum유틸리티를 root로 사용하여 설치합니다.yum install httpd
~]# yum install httpdCopy to Clipboard Copied! Toggle word wrap Toggle overflow /var/www/html/디렉터리로 변경합니다. root로 다음 명령을 입력하여/디렉터리에 대한 링크(마운트 )를 생성합니다.shares/html]# ln -s /shares/ shares
html]# ln -s /shares/ sharesCopy to Clipboard Copied! Toggle word wrap Toggle overflow - Apache HTTP 서버를 시작합니다.
systemctl start httpd.service
~]# systemctl start httpd.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 웹 브라우저를 사용하여
http://localhost/shares로 이동합니다./shares/index.html파일이 표시됩니다.
기본적으로 Apache HTTP 서버는
index.html 파일이 있는 경우 읽습니다. /shares/ 에 index.html 이 없고 대신 file1,file2, file3 이 있는 경우 http://localhost/shares 에 액세스할 때 디렉터리 목록이 발생합니다.
index.html파일을 제거합니다.rm -i /shares/index.html
~]# rm -i /shares/index.htmlCopy to Clipboard Copied! Toggle word wrap Toggle overflow /shares/:에 3개의 파일을 생성하려면touch유틸리티를 root로 사용합니다.Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root로 다음 명령을 입력하여 Apache HTTP Server의 상태를 확인합니다.
systemctl status httpd.service
~]# systemctl status httpd.service httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled) Active: inactive (dead)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 서버가 중지되면 시작합니다.systemctl start httpd.service
~]# systemctl start httpd.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 웹 브라우저를 사용하여
http://localhost/shares로 이동합니다. 디렉터리 목록이 표시됩니다.
13.4.4. 포트 번호 변경 링크 복사링크가 클립보드에 복사되었습니다!
링크 복사링크가 클립보드에 복사되었습니다!
정책 구성에 따라 서비스는 특정 포트 번호에서만 실행되도록 허용할 수 있습니다. 정책 변경 없이 서비스가 실행되는 포트를 변경하려고 하면 서비스가 시작되지 않을 수 있습니다.
semanage 유틸리티를 root 사용자로 사용하여 SELinux가 httpd 에서 수신 대기할 수 있는 포트를 나열합니다.
semanage port -l | grep -w http_port_t
~]# semanage port -l | grep -w http_port_t
http_port_t tcp 80, 443, 488, 8008, 8009, 8443
기본적으로 SELinux는
httpd 가 TCP 포트 80, 443, 488, 8008, 8009 또는 8443에서 수신 대기하도록 허용합니다. httpd 가 http_port_t 에 대해 나열되지 않은 포트에서 수신 대기하도록 /etc/httpd/conf/httpd.conf 가 구성된 경우httpd 가 시작되지 않습니다.
TCP 포트 80, 443, 488, 8008, 8009 또는 8443 이외의 포트에서 실행되도록
httpd 를 구성하려면 다음을 수행합니다.
/etc/httpd/conf/httpd.conf파일을 root로 편집하여Listen옵션은httpd에 대해 SELinux 정책에 구성되지 않은 포트를 나열합니다. 다음 예제에서는 10.0.0.1 IP 주소 및 TCP 포트 12345에서 수신 대기하도록httpd를 구성합니다.Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 다음 명령을 root 사용자로 입력하여 포트를 SELinux 정책 구성에 추가합니다.
semanage port -a -t http_port_t -p tcp 12345
~]# semanage port -a -t http_port_t -p tcp 12345Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 포트가 추가되었는지 확인합니다.
semanage port -l | grep -w http_port_t
~]# semanage port -l | grep -w http_port_t http_port_t tcp 12345, 80, 443, 488, 8008, 8009, 8443Copy to Clipboard Copied! Toggle word wrap Toggle overflow
포트 12345에서
httpd 를 더 이상 실행하지 않는 경우 semanage 유틸리티를 root로 사용하여 정책 구성에서 포트를 제거합니다.
semanage port -d -t http_port_t -p tcp 12345
~]# semanage port -d -t http_port_t -p tcp 12345