Setup SELinux When Installing nginx on Centos 7 - goddes4/python-study-wiki GitHub Wiki

Centos 7 ์— Nginx + uWSGI ์„ค์น˜์‹œ SELinux ์„ค์ •

Centos 7 ์—์„œ Nginx + uWSGU + Flask ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ Nginx ์™€ uWSGI ๊ฐ„ ๋‚ด๋ถ€ ์†Œ์ผ“ ํ†ต์‹ ์—์„œ ๊ถŒํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ๋ฌธ์ œ์˜ ์›์ธ์€ SELinux ์ธ ๊ฒฝ์šฐ๊ฐ€ ๋‹ค์ˆ˜์ด๋‹ค.

SELinux๊ฐ€ ํ™œ์„ฑํ™” ๋˜๋ฉด ํŠน์ • ํ”„๋กœ๊ทธ๋žจ์ด ํŠน์ • ํŒŒ์ผ์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ์ง€๋ฅผ ํŒ๋‹จํ•˜๊ณ  ๊ทธ์— ๋”ฐ๋ผ ํ—ˆ์šฉ ๋˜๋Š” ์ฐจ๋‹จํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด nginx๊ฐ€ uWSGI ์™€ ํ†ต์‹  ํ•˜๊ธฐ ์œ„ํ•ด ์ƒ์„ฑํ•œ unix sock ํŒŒ์ผ์— ์— ์“ฐ๊ธฐ ๊ถŒํ•œ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์—†์œผ๋ฉด ์ฐจ๋‹จํ•œ๋‹ค.

๋‹ค์Œ์€ ์œ„ ์˜ˆ์‹œ์— ๋Œ€ํ•œ ์ฐจ๋‹จ ๋กœ๊ทธ์ด๋‹ค. ๋กœ๊ทธ ํŒŒ์ผ์€ /var/log/audit/audit.log ์ด๋‹ค.

type=AVC msg=audit(1475712790.359:4968): avc:  denied  { write } for  pid=17389 comm="nginx" 
name="uwsgi.sock" dev="tmpfs" ino=113259 scontext=system_u:system_r:httpd_t:s0 
tcontext=system_u:object_r:var_run_t:s0 tclass=sock_file

SELinux ๋ž€

  • Linux์˜ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•ด ์ฃผ๋Š” ๋ณด์•ˆ ๊ฐ•ํ™” ์ปค๋„
  • zero-day ๊ณต๊ฒฉ ๋ฐ buffer overflow ๋“ฑ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ทจ์•ฝ์ ์œผ๋กœ ์ธํ•œ ํ•ดํ‚น์„ ๋ฐฉ์ง€ํ•ด์คŒ

SELinux ๋ชจ๋“œ ํ™•์ธ

# sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      28

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

๋‹ค์Œ์— ์„ค๋ช…๋œ 4๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ค‘ ๋ณ„๋„์˜ ๋ฏฟ์„๋งŒํ•œ ๋ณด์•ˆ์†”๋ฃจ์…˜์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋ฉด 4๋ฒˆ์งธ ๋ฐฉ๋ฒ•์„ ๊ฐ€์žฅ ์ถ”์ฒœํ•œ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• #1 (SELinux ํ•ด์ œ)

  • SELINUX ๊ฐ’์„ enforcing ์—์„œ disabled ๋กœ ๋ณ€๊ฒฝ ํ›„ ์ €์žฅ ๋ฐ ์žฌ๋ถ€ํŒ… ํ•œ๋‹ค.
  • ์ธํ„ฐ๋„ท์— ์˜คํ”ˆ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋‚˜ ์„œ๋ฒ„ํŒœ๋‹จ์— ๋ณ„๋„์˜ ๋ณด์•ˆ์žฅ๋น„(๋ฐฉํ™”๋ฒฝ, IPS)๋“ฑ์ด ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉํ•œ๋‹ค.
# vi /etc/sysconfig/selinux

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• #2 (๋™์ž‘๋ชจ๋“œ : Permissive ๋ณ€๊ฒฝ)

  • ์ด ๋ฐฉ๋ฒ•์€ SELinux์˜ ๋™์ž‘ ๋ชจ๋“œ๋ฅผ Enforcing ์—์„œ Permissive ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ, rule์— ์–ด๊ธ‹๋‚˜๋”๋ผ๋„ audit log๋ฅผ ๋‚จ๊ธฐ๊ณ  ๋™์ž‘์€ ํ—ˆ์šฉ๋œ๋‹ค.
  • ๊ทผ๋ณธ์  ํ•ด๊ฒฐ์€ ์•„๋‹ˆ๊ณ  ์˜ค๋ฅ˜์˜ ์›์ธ์ด SELinux ์ž„์„ ํŒ๋‹จํ•  ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋œ๋‹ค.
# setenforce 0
# getenforce
Permissive 

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• #3 (httpd_can_network_connect ํ™œ์„ฑํ™”)

  • httpd ๋„คํŠธ์›Œํฌ ์ ‘์†์„ ํ—ˆ์šฉํ•˜์—ฌ Nginx ์™€ uWSGI์˜ ํ†ต์‹ ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ค€๋‹ค.
# getsebool -a | grep http
# setsebool httpd_can_network_connect on -P

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• #4 (์ƒˆ๋กœ์šด ์ •์ฑ… ์ ์šฉ)

  • audit log ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ถŒํ•œ ์ •์ฑ… ํŒŒ์ผ์„ ๋งŒ๋“ ๋‹ค.
  • ์‹คํ–‰ ๊ฒฐ๊ณผ๋กœ .pp ํŒŒ์ผ๊ณผ .te ํŒŒ์ผ์ด ๋งŒ๋“ค์–ด ์ง„๋‹ค.
  • te ํŒŒ์ผ์€ ์ถ”๊ฐ€๋˜๋Š” ์ •์ฑ… ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๊ณ , pp ํŒŒ์ผ์€ ์ƒˆ๋กœ์šด ๊ถŒํ•œ ์ •์ฑ…์„ ์ ์šฉํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

audit2allow ์‚ฌ์šฉ์„ ์œ„ํ•œ ํŒจํ‚ค์ง€ ์„ค์น˜

audit2allow ํŒŒ์ผ์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ policycoreutils-python๋ฅผ ์„ค์น˜ํ•œ๋‹ค.

# yum install policycoreutils-python

์ ‘๊ทผ์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” ํ•ญ๋ชฉ์—๋Œ€ํ•ด ๊ถŒํ•œ์„ ์ฃผ๋Š” ์ •์ฑ… ์ƒ์„ฑ ๋ฐ ์ ์šฉ

# cat /var/log/audit/audit.log | grep nginx | grep denied | audit2allow -M nginx
# semodule -i nginx.pp

์ •์ฑ… ์ทจ์†Œ

ํ–ฅํ›„์— ์ •์ฑ…์„ ์ทจ์†Œํ•  ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ pp ํŒŒ์ผ์„ ๋ณด์กดํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

# semodule -r httpd.pp

write ๊ถŒํ•œ ์ •์ฑ… ๊ฒฐ๊ณผ๋ฌผ ์˜ˆ์‹œ

Audit Denied ๋กœ๊ทธ

type=AVC msg=audit(1475712790.359:4968): avc:  denied  { write } for  pid=17389 comm="nginx" 
name="uwsgi.sock" dev="tmpfs" ino=113259 scontext=system_u:system_r:httpd_t:s0 
tcontext=system_u:object_r:var_run_t:s0 tclass=sock_file

์ •์ฑ… ๊ฒฐ๊ณผ๋ฌผ

module nginx 1.0;

require {
        type var_run_t;
        type httpd_t;
        class sock_file write;
}

#============= httpd_t ==============
allow httpd_t var_run_t:sock_file write;

name_connect ๊ถŒํ•œ ์ •์ฑ… ๊ฒฐ๊ณผ๋ฌผ ์˜ˆ์‹œ

Audit Denied ๋กœ๊ทธ

type=AVC msg=audit(1475713241.083:4976): avc:  denied  { name_connect } for  pid=17896 comm="nginx" 
dest=8787 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:jboss_debug_port_t:s0 
tclass=tcp_socket

์ •์ฑ… ๊ฒฐ๊ณผ๋ฌผ

module nginx 1.0;

require {
        type httpd_t;
        type jboss_debug_port_t;
        class tcp_socket name_connect;
}

#============= httpd_t ==============

#!!!! This avc is allowed in the current policy
allow httpd_t jboss_debug_port_t:tcp_socket name_connect;