SELinux์™€ AppArmor

SELinux์™€ AppArmor

ํ•™์Šต ๋ชฉํ‘œ

์ด ๋ฌธ์„œ๋ฅผ ํ†ตํ•ด ๋‹ค์Œ์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค:

  • ํ•„์ˆ˜ ์ ‘๊ทผ ์ œ์–ด(MAC)์˜ ๊ฐœ๋…๊ณผ ํ•„์š”์„ฑ
  • SELinux ๋ชจ๋“œ์™€ ์ •์ฑ… ๊ด€๋ฆฌ
  • AppArmor ํ”„๋กœํŒŒ์ผ ์ž‘์„ฑ ๋ฐ ๊ด€๋ฆฌ
  • ๋ณด์•ˆ ๋ชจ๋“ˆ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

๋‚œ์ด๋„: โญโญโญโญ (๊ณ ๊ธ‰)


๋ชฉ์ฐจ

  1. ํ•„์ˆ˜ ์ ‘๊ทผ ์ œ์–ด ๊ฐœ์š”
  2. SELinux ๊ธฐ์ดˆ
  3. SELinux ์ •์ฑ… ๊ด€๋ฆฌ
  4. SELinux ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…
  5. AppArmor ๊ธฐ์ดˆ
  6. AppArmor ํ”„๋กœํŒŒ์ผ
  7. ์‹ค๋ฌด ์‹œ๋‚˜๋ฆฌ์˜ค

1. ํ•„์ˆ˜ ์ ‘๊ทผ ์ œ์–ด ๊ฐœ์š”

DAC vs MAC

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    ์ ‘๊ทผ ์ œ์–ด ๋น„๊ต                            โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  DAC (Discretionary Access Control)                         โ”‚
โ”‚  - ์ „ํ†ต์ ์ธ Unix ๊ถŒํ•œ ๋ชจ๋ธ                                  โ”‚
โ”‚  - ํŒŒ์ผ ์†Œ์œ ์ž๊ฐ€ ๊ถŒํ•œ ๊ฒฐ์ •                                  โ”‚
โ”‚  - chmod, chown์œผ๋กœ ๊ด€๋ฆฌ                                    โ”‚
โ”‚  - root๋Š” ๋ชจ๋“  ์ œํ•œ ์šฐํšŒ ๊ฐ€๋Šฅ                               โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  MAC (Mandatory Access Control)                             โ”‚
โ”‚  - ์‹œ์Šคํ…œ ์ •์ฑ…์ด ์ ‘๊ทผ ๊ฒฐ์ •                                  โ”‚
โ”‚  - ์‚ฌ์šฉ์ž๊ฐ€ ์ •์ฑ… ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€                                  โ”‚
โ”‚  - SELinux, AppArmor๋กœ ๊ตฌํ˜„                                 โ”‚
โ”‚  - root๋„ ์ •์ฑ…์— ์˜ํ•ด ์ œํ•œ๋จ                                โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๋ณด์•ˆ ๋ชจ๋“ˆ ๋น„๊ต

ํŠน์„ฑ SELinux AppArmor
๊ธฐ๋ฐ˜ ๋ฐฐํฌํŒ RHEL/CentOS/Fedora Ubuntu/Debian/SUSE
์ ‘๊ทผ ๋ฐฉ์‹ ๋ ˆ์ด๋ธ” ๊ธฐ๋ฐ˜ ๊ฒฝ๋กœ ๊ธฐ๋ฐ˜
๋ณต์žก๋„ ๋†’์Œ ๋‚ฎ์Œ
์„ธ๋ฐ€ํ•จ ๋งค์šฐ ์„ธ๋ฐ€ ์ค‘๊ฐ„
ํ•™์Šต ๊ณก์„  ๊ฐ€ํŒŒ๋ฆ„ ์™„๋งŒ
๊ธฐ๋ณธ ์ •์ฑ… ํฌ๊ด„์  ์ œํ•œ์ 

2. SELinux ๊ธฐ์ดˆ

SELinux ๋ชจ๋“œ

# ํ˜„์žฌ ๋ชจ๋“œ ํ™•์ธ
getenforce
# Enforcing, Permissive, ๋˜๋Š” Disabled

# ์ƒ์„ธ ์ƒํƒœ ํ™•์ธ
sestatus

# ์ž„์‹œ ๋ชจ๋“œ ๋ณ€๊ฒฝ (์žฌ๋ถ€ํŒ… ์‹œ ๋ณต์›)
sudo setenforce 0  # Permissive
sudo setenforce 1  # Enforcing

์˜๊ตฌ์  ๋ชจ๋“œ ๋ณ€๊ฒฝ

# /etc/selinux/config ํŽธ์ง‘
# RHEL/CentOS
sudo vi /etc/selinux/config
# /etc/selinux/config
SELINUX=enforcing     # enforcing, permissive, disabled
SELINUXTYPE=targeted  # targeted, minimum, mls

SELinux ์ปจํ…์ŠคํŠธ

๋ชจ๋“  ํŒŒ์ผ, ํ”„๋กœ์„ธ์Šค, ํฌํŠธ์— ๋ณด์•ˆ ์ปจํ…์ŠคํŠธ๊ฐ€ ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค:

์‚ฌ์šฉ์ž:์—ญํ• :ํƒ€์ž…:๋ ˆ๋ฒจ
user_u:role_r:type_t:s0
# ํŒŒ์ผ ์ปจํ…์ŠคํŠธ ํ™•์ธ
ls -Z /var/www/html/
# -rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 index.html

# ํ”„๋กœ์„ธ์Šค ์ปจํ…์ŠคํŠธ ํ™•์ธ
ps -eZ | grep httpd
# system_u:system_r:httpd_t:s0    12345 ?  00:00:01 httpd

# ์‚ฌ์šฉ์ž ์ปจํ…์ŠคํŠธ ํ™•์ธ
id -Z
# unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

์ฃผ์š” ํƒ€์ž…

ํƒ€์ž… ์„ค๋ช…
httpd_t Apache ์›น ์„œ๋ฒ„ ํ”„๋กœ์„ธ์Šค
httpd_sys_content_t ์›น ์ฝ˜ํ…์ธ  ํŒŒ์ผ
mysqld_t MySQL ํ”„๋กœ์„ธ์Šค
sshd_t SSH ๋ฐ๋ชฌ
user_home_t ์‚ฌ์šฉ์ž ํ™ˆ ๋””๋ ‰ํ† ๋ฆฌ
tmp_t ์ž„์‹œ ํŒŒ์ผ

3. SELinux ์ •์ฑ… ๊ด€๋ฆฌ

ํŒŒ์ผ ์ปจํ…์ŠคํŠธ ๋ณ€๊ฒฝ

# ์ž„์‹œ ๋ณ€๊ฒฝ (์žฌ๋ ˆ์ด๋ธ”๋ง ์‹œ ๋ณต์›)
chcon -t httpd_sys_content_t /var/www/custom/index.html

# ๋””๋ ‰ํ† ๋ฆฌ ์žฌ๊ท€์  ๋ณ€๊ฒฝ
chcon -R -t httpd_sys_content_t /var/www/custom/

# ๋‹ค๋ฅธ ํŒŒ์ผ์˜ ์ปจํ…์ŠคํŠธ ๋ณต์‚ฌ
chcon --reference=/var/www/html/index.html /var/www/custom/index.html

์˜๊ตฌ์  ์ปจํ…์ŠคํŠธ ์„ค์ •

# ์ •์ฑ…์— ์ปจํ…์ŠคํŠธ ๊ทœ์น™ ์ถ”๊ฐ€
sudo semanage fcontext -a -t httpd_sys_content_t "/srv/www(/.*)?"

# ์ •์ฑ… ์ ์šฉ
sudo restorecon -Rv /srv/www

# ์ปจํ…์ŠคํŠธ ๊ทœ์น™ ๋ชฉ๋ก ํ™•์ธ
sudo semanage fcontext -l | grep httpd

# ๊ทœ์น™ ์‚ญ์ œ
sudo semanage fcontext -d "/srv/www(/.*)?"

SELinux ๋ถˆ๋ฆฌ์–ธ

๋ถˆ๋ฆฌ์–ธ์€ SELinux ์ •์ฑ…์˜ ํŠน์ • ๊ธฐ๋Šฅ์„ ์ผœ๊ณ  ๋„๋Š” ์Šค์œ„์น˜์ž…๋‹ˆ๋‹ค:

# ๋ชจ๋“  ๋ถˆ๋ฆฌ์–ธ ๋ชฉ๋ก
getsebool -a

# ํŠน์ • ๋ถˆ๋ฆฌ์–ธ ํ™•์ธ
getsebool httpd_can_network_connect

# ์ž„์‹œ ๋ณ€๊ฒฝ
sudo setsebool httpd_can_network_connect on

# ์˜๊ตฌ ๋ณ€๊ฒฝ (-P ์˜ต์…˜)
sudo setsebool -P httpd_can_network_connect on

# ๋ถˆ๋ฆฌ์–ธ ๊ฒ€์ƒ‰
getsebool -a | grep httpd

์ฃผ์š” ๋ถˆ๋ฆฌ์–ธ ์˜ˆ์‹œ

# ์›น ์„œ๋ฒ„ ๊ด€๋ จ
httpd_can_network_connect      # ์™ธ๋ถ€ ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ํ—ˆ์šฉ
httpd_can_network_connect_db   # DB ์—ฐ๊ฒฐ ํ—ˆ์šฉ
httpd_can_sendmail            # ๋ฉ”์ผ ์ „์†ก ํ—ˆ์šฉ
httpd_enable_homedirs         # ์‚ฌ์šฉ์ž ํ™ˆ ๋””๋ ‰ํ† ๋ฆฌ ์ ‘๊ทผ

# FTP ๊ด€๋ จ
ftpd_anon_write              # ์ต๋ช… ์“ฐ๊ธฐ ํ—ˆ์šฉ
ftpd_full_access             # ์ „์ฒด ํŒŒ์ผ์‹œ์Šคํ…œ ์ ‘๊ทผ

# ๊ธฐํƒ€
samba_enable_home_dirs       # Samba ํ™ˆ ๋””๋ ‰ํ† ๋ฆฌ ๊ณต์œ 

ํฌํŠธ ์ปจํ…์ŠคํŠธ

# ํฌํŠธ ๋ ˆ์ด๋ธ” ํ™•์ธ
sudo semanage port -l | grep http
# http_port_t                    tcp      80, 81, 443, 488, 8008, 8009, 8443, 9000

# ์ƒˆ ํฌํŠธ ์ถ”๊ฐ€
sudo semanage port -a -t http_port_t -p tcp 8080

# ํฌํŠธ ์‚ญ์ œ
sudo semanage port -d -t http_port_t -p tcp 8080

# ํฌํŠธ ์ˆ˜์ •
sudo semanage port -m -t http_port_t -p tcp 8888

4. SELinux ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

๊ฐ์‚ฌ ๋กœ๊ทธ ํ™•์ธ

# SELinux ๊ฑฐ๋ถ€ ๋กœ๊ทธ ํ™•์ธ
sudo ausearch -m avc -ts recent

# ํŠน์ • ์„œ๋น„์Šค ๊ด€๋ จ ๋กœ๊ทธ
sudo ausearch -m avc -c httpd

# ์ฝ๊ธฐ ์‰ฌ์šด ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜
sudo ausearch -m avc -ts recent | audit2why

audit2why ์‚ฌ์šฉ

# ๊ฑฐ๋ถ€ ์ด์œ  ๋ถ„์„
sudo cat /var/log/audit/audit.log | audit2why

# ์˜ˆ์‹œ ์ถœ๋ ฅ:
# type=AVC msg=audit(...): avc:  denied  { read } for  pid=1234
# comm="httpd" name="index.html" dev="sda1" ino=12345
# scontext=system_u:system_r:httpd_t:s0
# tcontext=unconfined_u:object_r:user_home_t:s0 tclass=file
#
# Was caused by:
#   Missing type enforcement (TE) allow rule.

audit2allow๋กœ ์ •์ฑ… ์ƒ์„ฑ

# ํ—ˆ์šฉ ๊ทœ์น™ ์ƒ์„ฑ (ํ™•์ธ๋งŒ)
sudo ausearch -m avc -ts recent | audit2allow

# ๋กœ์ปฌ ๋ชจ๋“ˆ๋กœ ์ปดํŒŒ์ผ
sudo ausearch -m avc -ts recent | audit2allow -M mypolicy

# ๋ชจ๋“ˆ ์„ค์น˜
sudo semodule -i mypolicy.pp

# ์„ค์น˜๋œ ๋ชจ๋“ˆ ํ™•์ธ
sudo semodule -l | grep mypolicy

# ๋ชจ๋“ˆ ์ œ๊ฑฐ
sudo semodule -r mypolicy

sealert ์‚ฌ์šฉ (GUI/์ƒ์„ธ ๋ถ„์„)

# setroubleshoot ํŒจํ‚ค์ง€ ํ•„์š”
sudo yum install setroubleshoot-server

# ๋ถ„์„ ์‹คํ–‰
sudo sealert -a /var/log/audit/audit.log

# ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ ํ™•์ธ
sudo sealert -l "*"

์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ ํ•ด๊ฒฐ

# ๋ฌธ์ œ: ์›น ์„œ๋ฒ„๊ฐ€ ํŒŒ์ผ์„ ์ฝ์ง€ ๋ชปํ•จ
# 1. ์ปจํ…์ŠคํŠธ ํ™•์ธ
ls -Z /var/www/html/problem_file

# 2. ์ปจํ…์ŠคํŠธ ์ˆ˜์ •
sudo restorecon -v /var/www/html/problem_file

# ๋ฌธ์ œ: ์ปค์Šคํ…€ ํฌํŠธ ์‚ฌ์šฉ ๋ถˆ๊ฐ€
# 1. ํ˜„์žฌ ํฌํŠธ ๋ ˆ์ด๋ธ” ํ™•์ธ
sudo semanage port -l | grep 8080

# 2. ํฌํŠธ ์ถ”๊ฐ€
sudo semanage port -a -t http_port_t -p tcp 8080

# ๋ฌธ์ œ: ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ๊ฑฐ๋ถ€
# 1. ๊ด€๋ จ ๋ถˆ๋ฆฌ์–ธ ํ™•์ธ
getsebool -a | grep httpd_can_network

# 2. ๋ถˆ๋ฆฌ์–ธ ํ™œ์„ฑํ™”
sudo setsebool -P httpd_can_network_connect on

5. AppArmor ๊ธฐ์ดˆ

AppArmor ์ƒํƒœ ํ™•์ธ

# Ubuntu/Debian
sudo aa-status

# ๋˜๋Š”
sudo apparmor_status

์˜ˆ์‹œ ์ถœ๋ ฅ:

apparmor module is loaded.
38 profiles are loaded.
36 profiles are in enforce mode.
   /snap/snapd/19457/usr/lib/snapd/snap-confine
   /usr/bin/evince
   ...
2 profiles are in complain mode.
   /usr/sbin/cups-browsed
   /usr/sbin/cupsd

AppArmor ๋ชจ๋“œ

# Enforce ๋ชจ๋“œ: ์ •์ฑ… ์œ„๋ฐ˜ ์ฐจ๋‹จ
sudo aa-enforce /etc/apparmor.d/usr.sbin.nginx

# Complain ๋ชจ๋“œ: ์œ„๋ฐ˜ ๋กœ๊น…๋งŒ (์ฐจ๋‹จ ์•ˆ ํ•จ)
sudo aa-complain /etc/apparmor.d/usr.sbin.nginx

# ํ”„๋กœํŒŒ์ผ ๋น„ํ™œ์„ฑํ™”
sudo aa-disable /etc/apparmor.d/usr.sbin.nginx

# ํ”„๋กœํŒŒ์ผ ๋‹ค์‹œ ๋กœ๋“œ
sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.nginx

ํ”„๋กœํŒŒ์ผ ์œ„์น˜

# ์‹œ์Šคํ…œ ํ”„๋กœํŒŒ์ผ
ls /etc/apparmor.d/

# ์ฃผ์š” ํŒŒ์ผ๋“ค
/etc/apparmor.d/usr.sbin.nginx    # Nginx ํ”„๋กœํŒŒ์ผ
/etc/apparmor.d/usr.sbin.mysqld   # MySQL ํ”„๋กœํŒŒ์ผ
/etc/apparmor.d/abstractions/     # ๊ณต์œ  ๊ทœ์น™
/etc/apparmor.d/tunables/         # ๋ณ€์ˆ˜ ์ •์˜

6. AppArmor ํ”„๋กœํŒŒ์ผ

ํ”„๋กœํŒŒ์ผ ๊ตฌ์กฐ

#include <tunables/global>

/path/to/program {
  #include <abstractions/base>

  # ํŒŒ์ผ ์ ‘๊ทผ ๊ทœ์น™
  /etc/myapp.conf r,
  /var/log/myapp.log w,
  /usr/lib/myapp/** r,

  # ๋„คํŠธ์›Œํฌ ๊ทœ์น™
  network inet stream,

  # ์‹คํ–‰ ๊ทœ์น™
  /usr/bin/helper ix,
}

๊ถŒํ•œ ํ”Œ๋ž˜๊ทธ

ํ”Œ๋ž˜๊ทธ ์˜๋ฏธ
r ์ฝ๊ธฐ
w ์“ฐ๊ธฐ
a ์ถ”๊ฐ€
k ํŒŒ์ผ ์ž ๊ธˆ
l ๋งํฌ
m ๋ฉ”๋ชจ๋ฆฌ ๋งต ์‹คํ–‰
x ์‹คํ–‰
ix ๋™์ผ ํ”„๋กœํŒŒ์ผ๋กœ ์‹คํ–‰
px ๋‹ค๋ฅธ ํ”„๋กœํŒŒ์ผ๋กœ ์‹คํ–‰
ux ์ œํ•œ ์—†์ด ์‹คํ–‰
Px px + ํ™˜๊ฒฝ ์ •๋ฆฌ
Ux ux + ํ™˜๊ฒฝ ์ •๋ฆฌ

ํ”„๋กœํŒŒ์ผ ์ž‘์„ฑ ์˜ˆ์‹œ

# /etc/apparmor.d/usr.local.bin.myapp
#include <tunables/global>

/usr/local/bin/myapp {
  #include <abstractions/base>
  #include <abstractions/nameservice>

  # ์„ค์ • ํŒŒ์ผ ์ฝ๊ธฐ
  /etc/myapp/** r,

  # ๋ฐ์ดํ„ฐ ๋””๋ ‰ํ† ๋ฆฌ
  /var/lib/myapp/ r,
  /var/lib/myapp/** rw,

  # ๋กœ๊ทธ ํŒŒ์ผ
  /var/log/myapp/ r,
  /var/log/myapp/** rw,
  owner /var/log/myapp/*.log w,

  # ๋Ÿฐํƒ€์ž„ ํŒŒ์ผ
  /run/myapp.pid rw,
  /run/myapp.sock rw,

  # ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  /usr/lib/myapp/** rm,

  # ๋„คํŠธ์›Œํฌ ์ ‘๊ทผ
  network inet tcp,
  network inet udp,

  # ์‹œ์Šคํ…œ ํ˜ธ์ถœ ์ œํ•œ
  deny @{PROC}/** w,
  deny /sys/** w,

  # ์ž์‹ ํ”„๋กœ์„ธ์Šค
  /usr/bin/logger Px,
}

์ž๋™ ํ”„๋กœํŒŒ์ผ ์ƒ์„ฑ

# aa-genprof๋กœ ํ”„๋กœํŒŒ์ผ ์ƒ์„ฑ
sudo aa-genprof /usr/local/bin/myapp

# ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๊ณ  ์ผ๋ฐ˜์ ์ธ ์ž‘์—… ์ˆ˜ํ–‰
# aa-genprof๊ฐ€ ์ ‘๊ทผ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ํ”„๋กœํŒŒ์ผ ์ƒ์„ฑ

# aa-logprof๋กœ ๊ธฐ์กด ํ”„๋กœํŒŒ์ผ ์—…๋ฐ์ดํŠธ
sudo aa-logprof

Abstractions ์‚ฌ์šฉ

# /etc/apparmor.d/abstractions/ ๋‚ด ๊ณตํ†ต ๊ทœ์น™
# base          - ๊ธฐ๋ณธ ์‹œ์Šคํ…œ ์ ‘๊ทผ
# nameservice   - DNS, NSS ๋“ฑ
# authentication - PAM, shadow ๋“ฑ
# apache2-common - Apache ๊ณตํ†ต ๊ทœ์น™
# mysql         - MySQL ํด๋ผ์ด์–ธํŠธ ์ ‘๊ทผ
# php           - PHP ๊ด€๋ จ ์ ‘๊ทผ

ํ”„๋กœํŒŒ์ผ์—์„œ ์‚ฌ์šฉ:

#include <abstractions/base>
#include <abstractions/nameservice>

7. ์‹ค๋ฌด ์‹œ๋‚˜๋ฆฌ์˜ค

์‹œ๋‚˜๋ฆฌ์˜ค 1: ์›น ์„œ๋ฒ„ ์ปค์Šคํ…€ ๋””๋ ‰ํ† ๋ฆฌ (SELinux)

# ๋ฌธ์ œ: /data/www์—์„œ ์›น ์ฝ˜ํ…์ธ  ์ œ๊ณต ์‹œ 403 ์—๋Ÿฌ

# 1. ํ˜„์žฌ ์ปจํ…์ŠคํŠธ ํ™•์ธ
ls -Zd /data/www
# drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 /data/www

# 2. ์˜ฌ๋ฐ”๋ฅธ ์ปจํ…์ŠคํŠธ ์„ค์ •
sudo semanage fcontext -a -t httpd_sys_content_t "/data/www(/.*)?"
sudo restorecon -Rv /data/www

# 3. ํ™•์ธ
ls -Zd /data/www
# drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 /data/www

์‹œ๋‚˜๋ฆฌ์˜ค 2: PHP ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ DB ์—ฐ๊ฒฐ (SELinux)

# ๋ฌธ์ œ: PHP์—์„œ ์›๊ฒฉ MySQL ์—ฐ๊ฒฐ ์‹คํŒจ

# 1. ๋กœ๊ทธ ํ™•์ธ
sudo ausearch -m avc -c httpd | audit2why

# 2. ๋ถˆ๋ฆฌ์–ธ ํ™•์ธ
getsebool httpd_can_network_connect_db
# httpd_can_network_connect_db --> off

# 3. ๋ถˆ๋ฆฌ์–ธ ํ™œ์„ฑํ™”
sudo setsebool -P httpd_can_network_connect_db on

์‹œ๋‚˜๋ฆฌ์˜ค 3: Nginx ์ปค์Šคํ…€ ํฌํŠธ (AppArmor)

# /etc/apparmor.d/local/nginx
# ๋กœ์ปฌ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์šฉ ํŒŒ์ผ

# ์ถ”๊ฐ€ ํฌํŠธ ํ—ˆ์šฉ
network inet stream,

# ์ถ”๊ฐ€ ๊ฒฝ๋กœ ํ—ˆ์šฉ
/data/nginx/** r,
/var/log/nginx-custom/ rw,
/var/log/nginx-custom/** rw,
# ํ”„๋กœํŒŒ์ผ ๋ฆฌ๋กœ๋“œ
sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.nginx

์‹œ๋‚˜๋ฆฌ์˜ค 4: Docker์™€ SELinux

# Docker ์ปจํ…Œ์ด๋„ˆ์—์„œ ํ˜ธ์ŠคํŠธ ๋ณผ๋ฅจ ๋งˆ์šดํŠธ

# ๋ฐฉ๋ฒ• 1: z ์˜ต์…˜ (๊ณต์œ  ๋ ˆ์ด๋ธ”)
docker run -v /data:/data:z myimage

# ๋ฐฉ๋ฒ• 2: Z ์˜ต์…˜ (์ „์šฉ ๋ ˆ์ด๋ธ”)
docker run -v /data:/data:Z myimage

# ๋ฐฉ๋ฒ• 3: ์ˆ˜๋™ ๋ ˆ์ด๋ธ” ์ง€์ •
sudo chcon -Rt svirt_sandbox_file_t /data
docker run -v /data:/data myimage

์‹œ๋‚˜๋ฆฌ์˜ค 5: ์ƒˆ ์„œ๋น„์Šค ํ”„๋กœํŒŒ์ผ ์ƒ์„ฑ (AppArmor)

# 1. complain ๋ชจ๋“œ๋กœ ์‹œ์ž‘
sudo aa-complain /usr/local/bin/newservice

# 2. ์„œ๋น„์Šค ์‹คํ–‰ ๋ฐ ๋ชจ๋“  ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ

# 3. ๋กœ๊ทธ์—์„œ ํ”„๋กœํŒŒ์ผ ์—…๋ฐ์ดํŠธ
sudo aa-logprof

# 4. enforce ๋ชจ๋“œ๋กœ ์ „ํ™˜
sudo aa-enforce /usr/local/bin/newservice

# 5. ํ…Œ์ŠคํŠธ

์—ฐ์Šต ๋ฌธ์ œ

๋ฌธ์ œ 1: SELinux ์ปจํ…์ŠคํŠธ

๋‹ค์Œ ์ƒํ™ฉ์—์„œ ์–ด๋–ค ๋ช…๋ น์„ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ์š”? - /opt/webapp ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์›น ์„œ๋ฒ„ ์ฝ˜ํ…์ธ ๋กœ ์˜๊ตฌ ์„ค์ • - Apache๊ฐ€ 8443 ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ—ˆ์šฉ - httpd๊ฐ€ ์‚ฌ์šฉ์ž ํ™ˆ ๋””๋ ‰ํ† ๋ฆฌ์— ์ ‘๊ทผํ•˜๋„๋ก ํ—ˆ์šฉ

๋ฌธ์ œ 2: AppArmor ํ”„๋กœํŒŒ์ผ

/usr/local/bin/backup.sh ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋‹ค์Œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค: - /etc/ ์ฝ๊ธฐ - /var/backup/์— ์“ฐ๊ธฐ - rsync ์‹คํ–‰ - TCP 22๋ฒˆ ํฌํŠธ ๋„คํŠธ์›Œํฌ ์ ‘๊ทผ

์ด ์Šคํฌ๋ฆฝํŠธ์˜ AppArmor ํ”„๋กœํŒŒ์ผ์„ ์ž‘์„ฑํ•˜์„ธ์š”.

๋ฌธ์ œ 3: ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

SELinux Enforcing ๋ชจ๋“œ์—์„œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค: 1. ๋ฌธ์ œ๋ฅผ ์ง„๋‹จํ•˜๋Š” ๋‹จ๊ณ„๋ฅผ ๋‚˜์—ดํ•˜์„ธ์š” 2. ์–ด๋–ค ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ์š”?


์ •๋‹ต

๋ฌธ์ œ 1 ์ •๋‹ต

# ์›น ์ฝ˜ํ…์ธ  ์„ค์ •
sudo semanage fcontext -a -t httpd_sys_content_t "/opt/webapp(/.*)?"
sudo restorecon -Rv /opt/webapp

# ํฌํŠธ ์ถ”๊ฐ€
sudo semanage port -a -t http_port_t -p tcp 8443

# ํ™ˆ ๋””๋ ‰ํ† ๋ฆฌ ์ ‘๊ทผ ํ—ˆ์šฉ
sudo setsebool -P httpd_enable_homedirs on

๋ฌธ์ œ 2 ์ •๋‹ต

#include <tunables/global>

/usr/local/bin/backup.sh {
  #include <abstractions/base>
  #include <abstractions/bash>

  # ์„ค์ • ์ฝ๊ธฐ
  /etc/** r,

  # ๋ฐฑ์—… ๋””๋ ‰ํ† ๋ฆฌ
  /var/backup/ r,
  /var/backup/** rw,

  # rsync ์‹คํ–‰
  /usr/bin/rsync Px,

  # SSH ๋„คํŠธ์›Œํฌ
  network inet stream,
  network inet6 stream,
}

๋ฌธ์ œ 3 ์ •๋‹ต

# 1. SELinux ๋กœ๊ทธ ํ™•์ธ
sudo ausearch -m avc -ts recent

# 2. ์›์ธ ๋ถ„์„
sudo ausearch -m avc -ts recent | audit2why

# 3. ์ƒ์„ธ ๋ถ„์„ (setroubleshoot ์„ค์น˜ ์‹œ)
sudo sealert -a /var/log/audit/audit.log

# 4. ํ•ด๊ฒฐ์ฑ… ์ ์šฉ
# - ์ปจํ…์ŠคํŠธ ๋ฌธ์ œ: restorecon, semanage fcontext
# - ๋ถˆ๋ฆฌ์–ธ ๋ฌธ์ œ: setsebool
# - ํฌํŠธ ๋ฌธ์ œ: semanage port
# - ์ •์ฑ… ํ•„์š”: audit2allow๋กœ ์ปค์Šคํ…€ ๋ชจ๋“ˆ ์ƒ์„ฑ

๋‹ค์Œ ๋‹จ๊ณ„


์ฐธ๊ณ  ์ž๋ฃŒ

to navigate between lessons