본문 바로가기

0. 시작글
SELinux (Security Enhanced Linux)

LSM(Linux Security Modules) framework을 이용하여 커널에 MAC(Mandatory Access Control)을 구현한 것으로 
현재 대부분의 배포판에서 이를 지원하고 있습니다

SeLinux는 동작 주체(프로세스,사용자) 그리고 동작 대상인 파일,디사이스 등에 대한 접근 제어 하는 것입니다 

솔직히 서버를 설치후 SELinux를 올리게 되면  여러가지의 문제 점에 봉착하게됩니다
프로그램에서 모듈을 로드시키지 못한다든지 
프로그램에서 소켓생성이 실패한다든지 
잘되던 ftp접속이 안된다든지 이외에도 여러가지 문제가 발생하게 됩니다 

이로인해 성능, 안전성을 계로 selinux를 내려두고 운영하는경우가 대부분일 것입니다 
하지만 요즘의 시스템 침두방식을 생각하여 볼떼 이러단 보안 정책은 100%는아니지만 
시스템 운영에 많이 도움을 줄수 있습니다 

본 문서에서는 SELinux르 보다 쉡게 사용 간략하기 설정부분과 
케이스 별에 의한 회피방법에 대해 알아보독 하겠습니다 


1. SELinux 기능 끄기와 켜기 

    1) 설정파일 
        /etc/sysconfig/selinux 파일에 설정이 있으며 

        SELINUX 지시어의 값을 변경하면 된다. 핑
        켜기 : # SELINUX=enforcing 
        끄기 : # SELINUX=disabled 

      # 참고 
      SELINUX 지시어는 enforcing,permissive,disabled 세가지가 있으며 
      enforcing : 보안정책을 적용시킨다는 뜻입니다 
      permissive : enforcing시 발생하는 경고메세지를 출력하는 모드 입니다
      disabled  : 보안정책을 사용하지 않는다는  뜻입니다  

     SELINUXTYPE 지시어는 정책 적용방싱르 나타네며 targeted, strict 두가지가 있습니다 
     targeted : 네트웍 데몬에 대해서 보안정책을 적용하는 것 
     strict  : 시스템전체에대해 보안정책을 적용하는 것


    2) 명령어 
      setenforce 라는 명령를 이용하여 SELinux를 켜고 끌 수 있습니다 
      setenforce의 경우 boolean 값을 갖습니다 
      켜기 : # setenforce 1 
      끄기 : # setenforce 0 

    3) 부팅옵션에 추가 
      grub.conf에 부팅옵셩을 줘서 설정할수 있습니다 
      켜기 : selinux=1 
      끄기 : selinux=0 


2. SELinux관련 파일, 프로세서에 대한 태그확인 

      SELinux의 경우 보안태그 또는 라벨링을 통해 해당 파일이나 디렉토리분아니라 자원에 대한
      엑세스 허용 여부를 결정합니다 

            파일 상의 보안태그 또는 라벨링확인 방법 
            # ls -Z 
            -rw-------  root root system_u:object_r:user_home_t:s0 anaconda-ks.cfg 
            drwxr-xr-x  root root system_u:object_r:user_home_t:s0 bin 
            drwxr-xr-x  root root system_u:object_r:user_home_dir_t:s0 conf 
            -rw-r--r--  root root root:object_r:user_home_t:s0    install.log 
            -rw-r--r--  root root root:object_r:user_home_t:s0    install.log.syslog 

            프로세서상의 보안태그 또는 라벨링 
            # ps axZ | grep squid 
            user_u:system_r:squid_t 3912 ? Ss 0:00 squid -D 
            user_u:system_r:squid_t 3915 ? S 9:10 (squid) -D 
            user_u:system_r:squid_t 3916 ? Ss 0:01 (unlinkd) 

      SELinux의 현제 상태를 확인하기 위해서는 

      적용이 안된상태  : # sestatus -v 
            SELinux status:                disabled 

      적용이 된 상태    : # sestatus -v 
            SELinux status: enabled 
            SELinuxfs mount: /selinux 
            Current mode: enforcing 
            Mode from config file: enforcing 
            Policy version: 18 
            Policy from config file: targeted 
            Policy booleans: 
            allow_ypbind active 
            dhcpd_disable_trans inactive 
            httpd_disable_trans active 
            httpd_enable_cgi active 
            httpd_enable_homedirs active 
            httpd_ssi_exec active 
            httpd_tty_comm inactive 
            httpd_unified active 
            mysqld_disable_trans inactive 
            named_disable_trans active 
            named_write_master_zonesactive 
            nscd_disable_trans active 
            ntpd_disable_trans inactive 
            portmap_disable_trans inactive 
            postgresql_disable_transinactive 
            snmpd_disable_trans inactive 
            squid_disable_trans inactive 
            syslogd_disable_trans inactive 
            winbind_disable_trans inactive 
            ypbind_disable_trans inactive 
            Process contexts: 
            Current context: root:system_r:unconfined_t 
            Init context: user_u:system_r:unconfined_t 
            /sbin/mingetty user_u:system_r:unconfined_t 
            /usr/sbin/sshd user_u:system_r:unconfined_t 

            File contexts: 
            Controlling term: root:object_r:devpts_t 
            /etc/passwd root:object_r:etc_t 
            /etc/shadow system_u:object_r:shadow_t 
            /bin/bash system_u:object_r:shell_exec_t 
            /bin/login system_u:object_r:bin_t 
            /bin/sh system_u:object_r:bin_t -> system_u:object_r:shell_exec_t 
            /sbin/agetty system_u:object_r:sbin_t 
            /sbin/init system_u:object_r:init_exec_t 
            /sbin/mingetty system_u:object_r:sbin_t 
            /usr/sbin/sshd system_u:object_r:sbin_t 
            /lib/libc.so.6 system_u:object_r:lib_t -> system_u:object_r:shlib_t 
            /lib/ld-linux.so.2 system_u:object_r:lib_t -> system_u:object_r:ld_so_t 

3. SELinux관련 트러블슈팅 

      이부분은 실제 트러블 슈팅이라 하기에는 애매한 부분이 있습니다 
      정확하게 알고사용하면 문제된 부분이 없는데 모르기때문에 설정을 안하고 넘어가고 
      잘못하고 넘어가기에 발생하는 문제 들입니다 

      1) 심볼릭 링크상 관련 문제 
        dereference가 되면서 보안상의 문제가 발생하기에 읽어들 일 수 없는 경우가 발생합니다. 
        # chcon -h [filename] 

      2) 아파치의 403에러 
        보통 홈디렉토리를 옮기거나 기본경로가 아닐때 
        그리고 백업대이터를 이용하여 복구하였을때 많이 나타나는현상입니다 
        이경우 보안태그 또는 라벨링이 정상적으로 붙지않아 발생하는 경우입니다

        Context 설정을 설정파일상에 적용되어 있는 보안태그 또는 라벨링을 복원해주는 방법입니다 
        # restorecon -rv /home 

        단 이경우에는 기존의 템플릿이나 설정파일에 설정이 되어있어야 가능합니다  . 

        템플릿이나 설정파일을 직접 수정하기에 문제 있는 경우 
        # chcon -R -t httpd_sys_content_t /home/locli/public_html 

            # 참고 
            /etc/selinux/targeted/contexts/files/file_contexts
            일반적인 파일에 대한 설정 (/etc , /lib , /var등과 같이 설정 ,실행 ,라이브러리, 로그파일등에
                 대한 설정) 
            /etc/selinux/targeted/contexts/files/file_contexts.homedir 
            홈디렉토리의 파일에 대한설정 
            /etc/selinux/targeted/contexts/files/homedir.templete 
            홈디렉토리의 파일에 대한설정의 템플릿 파일 
  
      3) php 및 cgi 등의 프로그램에서 외부파일을 불러오지 못하는 경우 
        이 경우는 SELinux에 의해 아파치에서 네트웍 자원을 엑세스하지못해 발생하는 문제입니다  . 
        간단한 예를 들자면 php에서 원격 DB를 엑세스하지못하는경우 
        # setsebool -P httpd_can_network_connect_db on 

            # 참고 
            setsebool 명령어를 사용하여 할경우 -P옵선을 주게되면 설정파일에 반영되어
            리부팅후에도 설정 값이 사라지지 않습니다 . 

      4) /etc/vsftpd/vsftp.conf를 수정했는데도 불구하고 500 에러가 나오면서 접속이 안될 경우 
         # setsebool -P ftp_home_dir=1 

      5) annot restore segment prot after reloc: Permission denied 
        rpm 으로 설치된 라이브러리에서 발생하는경우는 드물다  주로 소스 컴파일을하거나 
        사용자가 만들 rpm 파일에서 발생합니다  . 
        간단하 예를 들자면 php의 모듈을 동적 컴파일로 올린경우 로드되지않을이다때 
        물론 컴파일등은 에러없이 ㅤ끝이난경우입니다 . 
        # chcon -t texrel_shlib_t [so 라이브러리] 


4. setsebool,chcon으로 설정가능한 항목 및 설정파일 

      1) FTP 관련 설정 
      기본경로 및 홈디렉토리 이외에 다른경로 또는 익명의 사용자가 ftp를 이용할경우 
      # chcon -R -t public_content_t /var/ftp 

      익명의 ftp사용자에게 쓰기 권한을 허용할 경우 

            특정경로에 보안태깅 및 라벨링을 하여 허옹 
            # chcon -t public_content_rw_t /var/ftp/incoming 

            불린값으로 허용 
            # setsebool -P allow_ftpd_anon_write=1 

            설정파일에 추가하여 허용 
            /etc/selinux/POLICYTYPE/contexts/files/file_contexts.local 
            /var/ftp(/.*)? system_u:object_r:public_content_t /var/ftp/incoming(/.*)? 

                system_u:object_r:public_content_rw_t 

            기본경로의 홈디렉토리가 아니거나 커스트마이징이 된 정책을 사용할경우 
            # setsebool -P ftp_home_dir 1 

            ftp만 SELinux 정책에서 제외해야할경우 
            # setsebool -P ftpd_is_daemon 1 

            데몬 실행중에 ftp만 SELinux 정책에서 제외해야할경우 : 
            # setsebool -P ftpd_disable_trans 1  

      2) HTTP 관련 설정 
         정의되어 있는 태깅 및 라벨링 명 
         httpd_sys_content_t  : 아파치의 모든 스크립트와 데몬에서 제공되는 모든 콘텐츠에 대한 설정 
         httpd_sys_script_exec_t  :  CGI실행을 허용 여부에 대한 설정 
         httpd_sys_script_ro_t  :    httpd_sys_script_exec_t 실행시 읽기 전용으로 사용 설정. 
         httpd_sys_script_rw_t  :    httpd_sys_script_exec_t 실행시 읽기/쓰기 전용으로 사용 설정. 
         httpd_sys_script_ra_t  :    httpd_sys_script_exec_t 실행시 읽기/append 전용으로 사용 설정 
         httpd_unconfined_script_exec_t : SELinux 보호 설정에 보호받지 않고 실행하기위한 설정 


      설정 예제) 
      멀티 도메인 하에 운영중인 서버에 정상적인 업로드를 지원하기위한 설정 
            # setsebool -P allow_httpd_anon_write=1 
            .. or .. 
            # setsebool -P allow_httpd_sys_script_anon_write=1 

      CGI 사용여부 결졍 
            # setsebool -P httpd_enable_cgi 1 

      기본경로의 홈디렉토리가 아니거나 커스트마이징이 된 정책을 사용할경 
            # setsebool -P httpd_enable_homedirs 1 
            .. OR .. 
            # chcon -R -t httpd_sys_content_t ~user/public_html 

      터미널을 엑세스 하기위한 설정 
            # setsebool -P httpd_tty_comm 1 
            # setsebool -P httpd_unified 0 

      php같이 모듈로 컴파일된 언어를 막기위한 설정 
            # setsebool -P httpd_builtin_scripting 0 

      네트웍 엑세스 허용 여부 설정 
            # setsebool -P httpd_can_network_connect 1 

      suexec 허용여부에 대한 설정 
            # setsebool -P httpd_suexec_disable_trans 1 

      httpd 데몬에 대해 SELinux 보호설정을 제외시킬때 
            # setsebool -P httpd_disable_trans 1 
            # service httpd restart 

      3) RSYNC 관련 
      특정 디렉토리의 rsync 허용방법 
            # chcon -t public_content_t /var/rsync 

      rsync 사용시 스기 허용 
            # setsebool -P allow_rsync_anon_write=1 

      rsync 데몬에 대해 SELinux 보호설정을 제외시킬때 
            # setsebool -P rsync_disable_trans 1 
            # service xinetd restar 

      4) named 관련 
      마스터의 zonefile을 업데이트하기위해 
            # setsebool -P named_write_master_zones 1 

      named 데몬에 대해 SELinux 보호설정을 제외시킬때 
            # setsebool -P named_disable_trans 1 
            # service named restart 

      5)  nfs 관련 
      읽기 전용 모드로 export 할 경우 
            # setsebool -P nfs_export_all_ro 1 

      일기/쓰기 모드로  export 할 경우 
            # setsebool -P nfs_export_all_rw 1 

      nfs로 원격서버의 스토리지를 마운트할경우 
            # setsebool -P use_nfs_home_dirs 1 

      6)  smb 관련 
      smb 를 이용할 데렉토리 설정 
            # chcon -t samba_share_t /data/share 
            .. or .. 
            vi /etc/selinux/POLICYTYPE/contexts/files/file_contexts.local 
            ...... 
             /data/share(/.*)? system_u:object_r:samba_share_t 

      공유 파일의 쓰기원한을 주기위한 설정 
            # setsebool - P allow_smbd_anon_write=1 

      smb mount를 혀용할 때 
            # setsebool -P samba_enable_home_dirs 1 
            # setsebool -P use_samba_home_dirs 1 

      smb 데몬에 대해 SELinux 보호설정을 제외시킬때 
            # setsebool -P smbd_disable_trans 1 
            # service smb restart 

      7) ypbind의 사용을 허용하기위한 설정 
            # setsebool -P allow_ypbind 1 

      8) kerberos 관련 
      kerberos 사용을 허용 할 경우 
            # setsebool -P allow_kerberos 1 

      kadmind or krb5kdc 데몬에 대해 SELinux 보호설정을 제외시킬때 
            # setsebool -P krb5kdc_disable_trans 1 
            # service krb5kdc restart 
            # setsebool -P kadmind_disable_trans 1 
            # service kadmind restart 


5. 로그의 형식 
로그의 경우 messege, audit 로그에 남게된다 
      형식은 아래의 로그와 같다. 
      May 10 00:39:53 server kernel: audit(1178725193.534:53): avc:  denied  { name_connect } for  pid=4178
       comm="httpd" dest=3306 scontext=user_u:system_r:httpd_t:s0tcontext=system_u:object_r:mysqld_port_t:s0
       tclass=tcp_socket 
      audit(timestamp) 로그가 기록되는 시간을 나타낸다 
      avc -- This message was from the SELinux access vector cache. Pretty much every message you are
              likely to see is from this cache. 
      denied | accepted 정첵에 의해 차단되었는지 허용되었는지를 나타낸다. 
      { read | write | unlink | ... } 타입을 나타댄다 . 파일인지  파일이면 읽기,쓰기 .... 
      for pid : 해당 프로세서의 pid를 나타낸다. 
      exe= -- This is the path to the executable that started the process. 
      name= -- This is the name of the target on which the action was attempted. 
      dev= -- This is the device on which the target file is located. 
      ino= -- This is the inode of the target of the action. 
      scontext= -- This is the process's security context. This contains user, role, and type. 
      tcontext= -- This is the security context of the target of this action, for example, the file, directory, etc. 
      tclass= -- This is the class of the target object, such as directory, file, device node, or something else. 

6.  마무리 

본 문서로 인해 많은 분들께서 SELinux를 사용 함에 있어 도움되 었으면 합니다 
웹의 내용은 모든 부분에서 다 적용이되는것은 아니며 
필자가 서비스 운영상에서 자주 밸생한 부분에 대한 것 만 추려둔것입니다 

다른 방법이니 잘못 기술된 부분이있으시다면  댓글을 남겨주시면 감사하겠습니다 


공개SW 설치/활용 - 번호, 제목, 작성자
번호 제목 작성자 조회수 작성
9 SELinux (Security Enhanced Linux) 시작하기 눈여울 7114 2011-05-10
8 메일/업무 협업 솔루션 Zimbra file 쭌군 2467 2011-05-09
7 웹서버(Nginx+FastCGI PHP)구축 및 성능 시험 Doly 2245 2011-04-25
6 "쉽고 빠르네!"...데스크톱 오픈소스 OS 우분투 설치기 OSS 897 2011-02-08
5 Resin [트러블슈팅 가이드] file OSS 1008 2010-10-28
4 Tomcat [트러블슈팅 가이드] file OSS 1123 2010-10-28
3 Apache [트러블슈팅 가이드] file OSS 1045 2010-10-28
2 MySQL [트러블슈팅 가이드] file 관리자 1029 2010-10-28
1 CUBRID [트러블슈팅 가이드] file 관리자 928 2010-10-28