- 사용 시스템
CentOS 6.4
- SELinux Mode 전환
Mode
1. enforce (1)
SELinux on
2. permissive (0)
SELinux off ( 기능이 꺼져있지만 log에는 잡힌다.)
3. disabled
off ( 기능도 꺼지고 log도 잡지 않는다.)
permissive 는 on도 아니고 off 도 아닌 SELinux의 기능 중 일부만 on 시켜놓는 것이다.
-> SELinux는 설정해야하는 것이 너무 복잡하고 많기 때문에 permissive에서 설정을 하고 log 기록을 보고 고치고 다시 enforce 로 전환한다.
EX) 원격 접속 서비스가 안될 때
enforce 으로 하면 SELinux 설정의 문제로 차단되는 것인지 원격 접속 서비스 자체 설정의 문제인지 방화벽의 문제인지 확인 하기 어렵다
permissive 로 하면 차단은 되지 않고 log 기록에만 남기때문에 일단 접속이 되는지 부터 확인하고 log 기록을 보고 SELinux의 설정을 고치면 된다.
[참고]
Enforce <--> Permissive 는 명령어로 바로바로 변경이 가능하지만 disabled <---> Enforce/Permissive 변경은
/etc/sysconfig/selinux 파일을 직접 변경하고 재부팅 과정을 거쳐야만 변경이 가능하다.
# sestatus
|
SELinux status: enabled SELinuxfs mount: /selinux Current mode: enforcing Mode from config file: enforcing Policy version: 24 Policy from config file: targeted |
|
# getenforce
|
Enforcing |
|
# setenforce 0
# getenforce
|
Permissive |
|
# setenforce 1
# getenforce
|
Enforcing |
|
# cat /etc/sysconfig/selinux
|
# This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=enforcing # SELINUXTYPE= can take one of these two values: # targeted - Targeted processes are protected, # mls - Multi Level Security protection. SELINUXTYPE=targeted |
|
- log 파일
- /var/log/messages : 간단한 요약 로그
- /var/log/audit/audit.log : 자세한 감사 로그
# yum install dbus audit setroubleshoot-server
# chkconfig auditd on /* 기본적으로 켜져 있음 */
# chkconfig rsyslog on /* 기본적으로 켜져 있음 */
# service auditd status
# service auditd start
# tail -f /var/log/audit/audit.log
- 주 설정 파일
# cat /etc/sysconfig/selinux
|
# This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=enforcing # SELINUXTYPE= can take one of these two values: # targeted - Targeted processes are protected, # mls - Multi Level Security protection. SELINUXTYPE=targeted |
|
- Booleans
활성/ 비활성을 할 수 있는 policy를 booleans 이라고 한다.
종류가 상당히 많으며 SELinux가 업데이트 될 때 마다 기능들이 추가되므로 서비스할 때 꼭 확인해 봐야 한다.
# semanage boolean
|
/usr/sbin/semanage: semanage [ -S store ] -i [ input_file | - ] semanage [ -S store ] -o [ output_file | - ] semanage login -{a|d|m|l|D|E} [-nrsN] login_name | %groupname semanage user -{a|d|m|l|D|E} [-LnrRPN] selinux_name semanage port -{a|d|m|l|D|E} [-nrtN] [ -p proto ] port | port_range semanage interface -{a|d|m|l|D|E} [-nrtN] interface_spec semanage module -{a|d|m} [-N] [--enable|--disable] module semanage node -{a|d|m|l|D|E} [-nrtN] [ -p protocol ] [-M netmask] addr semanage fcontext -{a|d|m|l|D|E} [-efnrstN] file_spec semanage boolean -{d|l|m} [-N] [--on|--off|-1|-0] -F boolean | boolean_file semanage permissive -{d|a|l} [-nN] type semanage dontaudit [-N] [ on | off ] Primary Options: -a, --add Add a OBJECT record NAME -d, --delete Delete a OBJECT record NAME -m, --modify Modify a OBJECT record NAME -i, --input Input multiple semange commands in a transaction -o, --output Output current customizations as semange commands -l, --list List the OBJECTS -E, --extract extract customizable commands -C, --locallist List OBJECTS local customizations -D, --deleteall Remove all OBJECTS local customizations -h, --help Display this message -N, --noreload Do not reload policy after commit -n, --noheading Do not print heading when listing OBJECTS -S, --store Select and alternate SELinux store to manage Object-specific Options (see above): -f, --ftype File Type of OBJECT "" (all files) -- (regular file) -d (directory) -c (character device) -b (block device) -s (socket) -l (symbolic link) -p (named pipe) -F, --file Treat target as an input file for command, change multiple settings -p, --proto Port protocol (tcp or udp) or internet protocol version of node (ipv4 or ipv6) -M, --mask Netmask -e, --equal Substitue source path for dest path when labeling -P, --prefix Prefix for home directory labeling -L, --level Default SELinux Level (MLS/MCS Systems only) -R, --roles SELinux Roles (ex: "sysadm_r staff_r") -s, --seuser SELinux User Name -t, --type SELinux Type for the object -r, --range MLS/MCS Security Range (MLS/MCS Systems only) --enable Enable a module --disable Disable a module Requires 2 or more arguments |
|
# semanage boolean -l
|
SELinux 부울 상태 디폴트 설명 ftp_home_dir (비활성 , 비활성 ) Allow ftp to read and write files in the user home directories smartmon_3ware (비활성 , 비활성 ) Enable additional permissions needed to support devices on 3ware controllers. xdm_sysadm_login (비활성 , 비활성 ) Allow xdm logins as sysadm xen_use_nfs (비활성 , 비활성 ) Allow xen to manage nfs files mozilla_read_content (비활성 , 비활성 ) Control mozilla content access ssh_chroot_rw_homedirs (비활성 , 비활성 ) Allow ssh with chroot env to read and write files in the user hom e directories ..... 중략..... |
|
# getsebool -a /* semanage boolean 에서 이름과 현재 상태만 출력 */
|
abrt_anon_write --> off abrt_handle_event --> off allow_console_login --> on allow_cvs_read_shadow --> off allow_daemons_dump_core --> on allow_daemons_use_tcp_wrapper --> off allow_daemons_use_tty --> on ..... 중략..... |
|
# getbool allow_console_login
|
allow_console_login --> on |
|
# semanage boolean -l | grep ftp
|
ftp_home_dir (비활성 , 비활성 ) Allow ftp to read and write files in the user home directories allow_ftpd_full_access (비활성 , 비활성 ) Allow ftp servers to login to local users and read/write all files on the system, governed by DAC. allow_ftpd_use_cifs (비활성 , 비활성 ) Allow ftp servers to use cifs used for public file transfer services. allow_ftpd_use_nfs (비활성 , 비활성 ) Allow ftp servers to use nfs used for public file transfer services. allow_ftpd_anon_write (비활성 , 비활성 ) Allow ftp servers to upload files, used for public file transfer services. Directories must be labeled public_content_rw_t. tftp_anon_write (비활성 , 비활성 ) Allow tftp to modify public files used for public file transfer services. ftpd_use_passive_mode (비활성 , 비활성 ) Determine whether ftpd can bind to all unreserved ports for passive mode. tftp_use_cifs (비활성 , 비활성 ) Allow tftp to read from a CIFS store for public file transfer services. tftp_use_nfs (비활성 , 비활성 ) Allow tftp to read from a NFS store for public file transfer services. ftpd_use_fusefs (비활성 , 비활성 ) Allow ftpd to use ntfs/fusefs volumes. ftpd_connect_db (비활성 , 비활성 ) Allow ftp servers to use connect to mysql database httpd_enable_ftp_server (비활성 , 비활성 ) Allow httpd to act as a FTP server by listening on the ftp port. |
|
# getsebool allow_ftpd_full_access
|
allow_ftpd_full_access --> off |
|
# setsebool allow_ftpd_full_access on
# getsebool allow_ftpd_full_access
|
allow_ftpd_full_access --> on |
|
-SELinux FTP 실습
KaliLinux ---- FTP ----> SELinux
user01 user01
192.168.17.60 192.168.17.70
(SELinux)
# yum -y install ftp vsftpd
# sed -i 's/^root/#root/' /etc/vsftpd/ftpusers
# sed -i 's/^root/#root/' /etc/vsftpd/user_list
# chkconfig vsftpd on
# service vsftpd start
# chkconfig iptables off
# serivce iptables stop
# setsebool allow_ftpd_full_access off
# tail -f /var/log/audit/audit.log
(KaliLinux)
# su - user01
# ftp 192.168.17.70
>> 잘 된다.
> allow_ftpd_full_access 를 off 시켰는대도 연결이 된다.
(SELinux)
# getenforce
|
Permissive |
|
> permissive 는 제한 기능은 끄고 log 기록으로만 남기기 때문에 접근 자체는 가능하다.
# tail -f /var/log/audit/audit.log
|
type=USER_AUTH msg=audit(1514486700.182:33212): user pid=29557 uid=0 auid=0 ses=1 subj=unconfined_u:system_r:ftpd_t:s0-s0:c0.c1023 msg='op=PAM:authentication acct="user01" exe="/usr/sbin/vsftpd" hostname=192.168.17.60 addr=192.168.17.60 terminal=ftp res=success' type=USER_ACCT msg=audit(1514486700.185:33213): user pid=29557 uid=0 auid=0 ses=1 subj=unconfined_u:system_r:ftpd_t:s0-s0:c0.c1023 msg='op=PAM:accounting acct="user01" exe="/usr/sbin/vsftpd" hostname=192.168.17.60 addr=192.168.17.60 terminal=ftp res=success' type=CRED_ACQ msg=audit(1514486700.185:33214): user pid=29557 uid=0 auid=0 ses=1 subj=unconfined_u:system_r:ftpd_t:s0-s0:c0.c1023 msg='op=PAM:setcred acct="user01" exe="/usr/sbin/vsftpd" hostname=192.168.17.60 addr=192.168.17.60 terminal=ftp res=success' |
|
> 로그는 잘 잡혔다.
# setenforce 1
(KaliLinux)
|
Connected to 192.168.17.70. 220 (vsFTPd 2.2.2) Name (192.168.17.70:root): user01 331 Please specify the password. Password: 500 OOPS: cannot change directory:/home/user01 Login failed. ftp> |
|
> 정상적으로 차단 됐다.
- Context
SELinux 는 모든 프로세스와 객체마다 보안 컨덱스트 라고 부르는 정보를 부여하고 관리하고 있다.
컨텍스트는 4가지 구성 요소로 이루어져 있다.
user / role / type / label
가장 중요한 부분은 type이다.
ls -Z /* 보안 Context 를 확인 할 수 있다. */
# ls -Z file1
|
-rw-r--r--. root root unconfined_u:object_r:default_t:s0 file1 |
|
> unconfined_u user
> object_r role
> default_t type
> s0 lable
# chcon -t samba_share_t file1 /* change context */
# ls -Z file1
|
-rw-r--r--. root root unconfined_u:object_r:samba_share_t:s0 file1 |
|
# restorecon -v file1 /* 이전의 설정으로 복구한다. -v 옵션을 입력하면 복구한 내용 출력 */
|
restorecon reset /test/file1 context unconfined_u:object_r:samba_share_t:s0->unconfined_u:object_r:default_t:s0 |
|
> 설정이 복잡하므로 잘못 설정할 때를 대비하여 복구하는 명령어를 만들어 놓았다.
( context 설정된 파일 확인 )
# cat /etc/selinux/targeted/contexts/files/file_context | more
|
/.* system_u:object_r:default_t:s0 /[^/]+ -- system_u:object_r:etc_runtime_t:s0 /a?quota\.(user|group) -- system_u:object_r:quota_db_t:s0 /nsr(/.*)? system_u:object_r:var_t:s0 /sys(/.*)? system_u:object_r:sysfs_t:s0 /xen(/.*)? system_u:object_r:xen_image_t:s0 /mnt(/[^/]*) -l system_u:object_r:mnt_t:s0 /mnt(/[^/]*)? -d system_u:object_r:mnt_t:s0 /bin/.* system_u:object_r:bin_t:s0 /dev/.* system_u:object_r:device_t:s0 /lib/.* system_u:object_r:lib_t:s0 /srv/.* system_u:object_r:var_t:s0 /usr/.* system_u:object_r:usr_t:s0 /tmp/.* <<none>> /opt/.* system_u:object_r:usr_t:s0 /var/.* system_u:object_r:var_t:s0 ........ |
|
> 디렉터리에도 설정이 가능하며 디렉터리에 설정된 값은 하위 파일이나 폴더를 만들면 자동으로 설정된다.
> 폴더나 파일을 만들때 상위 디렉터리의 context 설정을 따라가지만 만들고 난 뒤 상위 디렉터리의 설정이 바뀌면 같이 바뀌지 않는다.
# chcon -R -t httpd_sys_content_t /web >> -R 옵션을 쓰면 하위 모든 디렉터리 파일들의 설정을 바꾼다.
chcon 명령어는 임시적으로 설정을 바꾼다 -> 재부팅하면 원래대로 돌아옴
# semanage fcontext -a -t samba_share_t /test/file1 > 재부팅 해도 값을 유지한다. ( 현재를 바꾸는 것은 아니다. )
# cat /etc/selinux/targeted/contexts/files/file_contexts.local
|
# This file is auto-generated by libsemanage # Do not edit directly. /test/file1 system_u:object_r:samba_share_t:s0 |
|
> reboot을 해도 파일에 저장되어 있으므로 설정이 된다.
# semanage fcontext -d /test/file1 /* 설정 삭제 */
- cp / mv
context가 설정된 파일을 복사하면 복사 된 위치의 상위 디렉터리의 context를 따른다.
# ls -Z file1
|
-rw-r--r--. root root unconfined_u:object_r:samba_share_t:s0 file1 |
|
# cp file1 /home/user01
# ls -Z /home/user01/file1
|
-rw-r--r--. root root unconfined_u:object_r:user_home_t:s0 /home/user01/file1 |
|
# cp --preserve=context file1 /home/user01/file2 /* context 를 유지하면서 복사한다. */
# ls -Z /home/user01/file2
|
-rw-r--r--. root root unconfined_u:object_r:samba_share_t:s0 /home/user01/file2 |
|
# cp -Z system_u:object_r:samba_share_t:s0 file1 file3
> 입력한 context로 변경해서 복사된다.
# matchpathcon -V /home/user01/*
|
/home/user01/file1 verified. /home/user01/file2 has context unconfined_u:object_r:samba_share_t:s0, should be unconfined_u:object_r:user_home_t:s0 |
|
> matchpathcon 은 상위 디렉터리의 설정과 다르게 설정된 파일과 디렉터리를 찾아준다.
# rm -rf /home/user01/file*
# ls -Z file1
|
-rw-r--r--. root root unconfined_u:object_r:samba_share_t:s0 file1 |
|
# mv file1 /home/user01
|
-rw-r--r--. root root unconfined_u:object_r:samba_share_t:s0 /home/user01/file1 |
|
> cp와 달리 mv는 파일의 설정이 유지 된다.
[참고] cp / mv
cp는 복사해서 새로 다시 만드는 것이기 때문에 새로 만드는 파일은 상위 디렉터리의 context의 영향을 받는다.
mv는 자체를 이동 시키는 것이기 때문에 context 설정의 변화가 없다.
- Context 정보
# avcstat
|
lookups hits misses allocs reclaims frees 11906456 11891550 14906 14922 11952 14412 |
|
# seinfo
|
Statistics for policy file: /etc/selinux/targeted/policy/policy.24 Policy Version & Type: v.24 (binary, mls) Classes: 81 Permissions: 238 Sensitivities: 1 Categories: 1024 Types: 3920 Attributes: 295 Users: 9 Roles: 12 Booleans: 237 Cond. Expr.: 277 Allow: 323333 Neverallow: 0 Auditallow: 141 Dontaudit: 274717 Type_trans: 42430 Type_change: 38 Type_member: 48 Role allow: 19 Role_trans: 386 Range_trans: 6258 Constraints: 90 Validatetrans: 0 Initial SIDs: 27 Fs_use: 23 Genfscon: 84 Portcon: 474 Netifcon: 0 Nodecon: 0 Permissives: 90 Polcap: 2 |
|
# seinfo -adomain -x
|
domain sosreport_t git_session_t cfengine_execd_t bootloader_t netutils_t qmail_tcp_env_t devicekit_power_t httpd_collectd_script_t sandbox_x_client_t nova_api_t ......... |
|
# sesearch --role_allow -t httpd_sys_content_ /etc/selinux/targeted/policy/policy.24
|
Found 19 role allow rules: allow system_r sysadm_r; allow sysadm_r system_r; allow sysadm_r staff_r; allow sysadm_r user_r; allow system_r guest_r; allow logadm_r system_r; allow system_r logadm_r; allow system_r nx_server_r; allow system_r staff_r; allow staff_r logadm_r; allow staff_r sysadm_r; allow staff_r unconfined_r; allow staff_r webadm_r; allow unconfined_r system_r; allow system_r unconfined_r; allow system_r user_r; allow webadm_r system_r; allow system_r webadm_r; allow system_r xguest_r; |
|
- 정리
SELinux 서비스 실행하기
1. 소프트웨어 설치
# yum -y install httpd httpd-tools
2. 서비스 ON
# chkconifg httpd on
# service httpd start
3. 서비스 방화벽에 등록
# iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
# service iptables save
4. boolean 설정
# getsebool -a | grep httpd
-> 적당한 기능 on
# setsebool httpd_enable_homedirs on
# setsebool -P httpd_enable_homedirs on
> 안되면 서비스 접속 후 audit message 확인
5. 데몬이 읽어 들이는 파일 설정
# mv /home/user01/index.html /var/www/html
# chcon -t httpd_sys_content_t /var/www/html
# semanage fcontext -a -t httpd_sys_content_t /var/www/html
- 서비스 안될 때 해결 방법
# cat /var/log/messages | grep setroubleshoot
|
Jun 20 20:57:09 ids setroubleshoot: SELinux is preventing /usr/sbin/vsftpd from read access on the directory user01. For complete SELinux messages. run sealert -l 53737277-ebdf-4141-b176-b805d2d5ae32 |
|
> 이런 로그가 쌓였다면 검색해본다.
# sealert -l 53737277-ebdf-4141-b176-b805d2d5ae32
SELinux is preventing /usr/sbin/vsftpd from read access on the directory user01. ***** Plugin catchall_boolean (47.5 confidence) suggests ******************* If you want to allow ftp servers to login to local users and read/write all files on the system, governed by DAC. Then you must tell SELinux about this by enabling the 'allow_ftpd_full_access'boolean. Do setsebool -P allow_ftpd_full_access 1 ***** Plugin catchall_boolean (47.5 confidence) suggests ******************* If you want to allow ftp to read and write files in the user home directories Then you must tell SELinux about this by enabling the 'ftp_home_dir'boolean. Do setsebool -P ftp_home_dir 1 ***** Plugin catchall (6.38 confidence) suggests *************************** If you believe that vsftpd should be allowed read access on the user01 directory by default. Then you should report this as a bug. You can generate a local policy module to allow this access. Do allow this access for now by executing: # grep vsftpd /var/log/audit/audit.log | audit2allow -M mypol # semodule -i mypol.pp Additional Information: Source Context unconfined_u:system_r:ftpd_t:s0-s0:c0.c1023 Target Context unconfined_u:object_r:user_home_dir_t:s0 Target Objects user01 [ dir ] Source vsftpd Source Path /usr/sbin/vsftpd Port <Unknown> Host ids.example.com Source RPM Packages vsftpd-2.2.2-24.el6.x86_64 Target RPM Packages Policy RPM selinux-policy-3.7.19-307.el6.noarch Selinux Enabled True Policy Type targeted Enforcing Mode Permissive Host Name ids.example.com Platform Linux ids.example.com 2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64 x86_64 Alert Count 1 First Seen Tue 20 Jun 2017 08:57:04 PM KST Last Seen Tue 20 Jun 2017 08:57:04 PM KST Local ID 53737277-ebdf-4141-b176-b805d2d5ae32 Raw Audit Messages type=AVC msg=audit(1497959824.436:89): avc: denied { read } for pid=32911 comm="vsftpd" name="user01" dev=dm-0 ino=530071 scontext=unconfined_u:system_r:ftpd_t:s0-s0:c0.c1023 tcontext=unconfined_u:object_r:user_home_dir_t:s0 tclass=dir type=SYSCALL msg=audit(1497959824.436:89): arch=x86_64 syscall=open success=yes exit=EIO a0=7f13fa163e10 a1=90800 a2=7f13fa163df0 a3=7fff99664100 items=0 ppid=32906 pid=32911 auid=0 uid=501 gid=501 euid=501 suid=501 fsuid=501 egid=501 sgid=501 fsgid=501 tty=(none) ses=2 comm=vsftpd exe=/usr/sbin/vsftpd subj=unconfined_u:system_r:ftpd_t:s0-s0:c0.c1023 key=(null) Hash: vsftpd,ftpd_t,user_home_dir_t,dir,read audit2allow #============= ftpd_t ============== #!!!! This avc can be allowed using one of the these booleans: # allow_ftpd_full_access, ftp_home_dir allow ftpd_t user_home_dir_t:dir read; audit2allow -R #============= ftpd_t ============== #!!!! This avc can be allowed using one of the these booleans: # allow_ftpd_full_access, ftp_home_dir allow ftpd_t user_home_dir_t:dir read; |
|
>setsebool -P allow_ftpd_full_access 1 를 해봐라.
>setsebool -P ftp_home_dir 1 를 해봐라 .
>> 몇가지 해결 방법을 알려준다.
'Security > Linux Server' 카테고리의 다른 글
File ACL (Access Control List) 사용법 (0) | 2017.12.28 |
---|---|
SELinux (Secure Enhanced Linux) GUI 사용 방법 (CentOS 6.4) (0) | 2017.12.28 |
SELinux (Secure Enhanced Linux) 설치 방법 (CentOS 6.4) (0) | 2017.12.27 |
SELinux (Secure Enhanced Linux)란? (0) | 2017.12.27 |
웹 방화벽 (WAF, Web Application Firewall)_ ModSecurity 실습/ 해제 (0) | 2017.12.27 |