강좌

HOME > 강좌 >
강좌| 리눅스 및 오픈소스에 관련된 강좌를 보실 수 있습니다.
 
SELinux 관련 문제 해결방법
조회 : 55,171  


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:s0 tcontext=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를 내리는 것이 제일먼저하는 일이었다
하지만 언제부터인가 SELinux를 사용하고 있는 업체들이 보여 내리자고만 할 수 가 없었다
물런 그런 업체들의 서버를 관리하는것은 아주짜증나는일이었다
성능저하만 시키고 설정하기 힘들게 되어있고  하지만 각 파일들에 대한 액세스 권한이
보다 세부적으로 나누어지고  서비스나 데몬의 크래킹이 전체 시스템에 영향을주는
것보다는 훨씬  안전하다는 것을 느낀 이후  SELinux에 대해 호감 아닌 호감을 가지게 되었고
그러다보니  모름에 대한거부감이 사라졌다

하지만 아직도 이부분에 대해서는 완전히 다알지는 못했다
그리고  4번 항목의 경우도 완전한 테스트가 이루어지지 않은부분이다 .

보다 많은 학습이 필요한 부분이기도 하다

[원글링크] : https://www.linux.co.kr/home2/board/subbs/board.php?bo_table=lecture&wr_id=1731


이 글을 트위터로 보내기 이 글을 페이스북으로 보내기 이 글을 미투데이로 보내기

 
이재석
본명 : 이재석
e-mail : locli앳superuser.co.kr
소속 : (주)수퍼유저코리아