본문으로 바로가기

- 사용 시스템 

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 를 해봐라 . 

>> 몇가지 해결 방법을 알려준다.