SELinux Boolean

SELinux boolean μ΄λž€?

SElinux λŠ” λ³΄μ•ˆ μ •μ±… μ„€μ • 편의λ₯Ό μœ„ν•΄ 사전에 μ •μ˜λœ κ·œμΉ™ 집합듀을 κ°–κ³  있으며 이 κ·œμΉ™λ“€μ„ SELinux 뢈린(Boolean) 이라고 ν•©λ‹ˆλ‹€.


예둜 Β μ•„νŒŒμΉ˜ httpd κ°€ cgi λ₯Ό μ‹€ν–‰ν•  수 있게 ν•˜λ €λ©΄ μ—¬λŸ¬ 가지 λ³΄μ•ˆ μ»¨ν…μŠ€νŠΈ 섀정을 ν•΄μ•Ό ν•˜μ§€λ§Œ 이런 λ²ˆκ±°λ‘œμ›€μ„ μ—†μ• κΈ° μœ„ν•΄ 이런 과정을 λ¬Άμ–΄μ„œ httpd_enable_cgi λΌλŠ” λΆˆλ¦°μ„ μ œκ³΅ν•˜κ³  있으며 true 둜 μ„€μ •ν•˜λ©΄ SELinux λŠ” μ•„νŒŒμΉ˜ μ›Ή μ„œλ²„μ˜ cgi 싀행을 ν—ˆμš©ν•©λ‹ˆλ‹€.

λ³΄μ•ˆμ„ μœ„ν•΄ λŒ€λΆ€λΆ„μ˜ 뢈린 섀정은 κΈ°λ³Έ 값이 off 이며 ν˜„μž¬ 섀정을 ν™•μΈν•˜λ €λ©΄ getsebool λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜λ©΄ 되며 ν™•μΈν•˜λ €λŠ” 뢈린λͺ…을 μ£Όκ±°λ‚˜ -a μ˜΅μ…˜μ„ 쀄 경우 λͺ¨λ“  뢈린의 μ„€μ • ν˜„ν™©μ„ ν‘œμ‹œν•©λ‹ˆλ‹€.


μ•„λž˜ λͺ…령은 μ•„νŒŒμΉ˜ httpd κ°€ SMTP 메일 μ„œλ²„μ— μ—°κ²°ν•  수 μžˆλŠ”μ§€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 뢈린인 httpd_can_sendmail 의 섀정을 ν™•μΈν•©λ‹ˆλ‹€.

$ getsebool httpd_can_sendmail


httpd_can_sendmail --> off
μ›Ή μ„œλ²„μ˜ 메일 전솑 ν—ˆμš© μ—¬λΆ€

λ˜λŠ” μ•„λž˜μ™€ 같이 λͺ¨λ“  λΆˆλ¦°μ„ 좜λ ₯ν•œ 후에 egrep κ³Ό μ •κ·œμ‹μ„ ν™œμš©ν•˜μ—¬ μ°ΎλŠ” 방법도 μžˆμŠ΅λ‹ˆλ‹€.

$ getsebool -a | getsebool -a | egrep "httpd(.*)sendmail"


httpd_can_sendmail --> off
λͺ¨λ“  뢈린 좜λ ₯


SELinux boolean μ„€μ •

κΈ°λ³Έ 섀정은 off μ΄λ―€λ‘œ 개발 μ–Έμ–΄λ₯Ό μ›Ή μ„œλ²„μ—μ„œ λͺ¨λ“ˆ ν˜•μ‹(PHP의 mod_php, python - mod_wsgi)으둜 Β μ‚¬μš©ν•   경우 apache μ›Ή μ„œλ²„μ˜ κΆŒν•œκ³Ό 도메인을 μƒμ†λ°›κ²Œ λ˜λ―€λ‘œ μž‘μ„±ν•œ μŠ€ν¬λ¦½νŠΈμ—μ„œ 메일 전솑을 ν• μˆ˜ μ—†μŠ΅λ‹ˆλ‹€.


이 문제λ₯Ό μž¬μ—°ν•΄ 보기 μœ„ν•΄ PHP μ—μ„œ mail ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ 메일을 μ „μ†‘ν•˜λŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•΄ λ΄…μ‹œλ‹€. mail() ν•¨μˆ˜μ˜ 첫번째 νŒŒλΌλ―Έν„°λŠ” μˆ˜μ‹ μžμ˜ 이메일 μ£Όμ†Œμ΄κ³  λ‘λ²ˆμ§ΈλŠ” 제λͺ©, μ„Έλ²ˆμ§ΈλŠ” λ³Έλ¬Έ λ‚΄μš©μž…λ‹ˆλ‹€.

<?php
Β 
mail('user@example.com', 'Subject', 'Message Body');
mailtest.php

λ…μžμ˜ μ„œλ²„μ— PHP 인터프리터가 μ„€μΉ˜λ˜μ–΄ 있고 mod_php λ°©μ‹μœΌλ‘œ λ™μž‘ν•œλ‹€κ³  κ°€μ •ν•œ μƒν™©μ—μ„œ μ˜ˆμ œμž…λ‹ˆλ‹€.


μœ„ 슀크립트λ₯Ό μ›Ή μ„œλ²„μ˜ 컨텐츠 경둜(예: /var/www/html/mailtest.php) 에 μ €μž₯ν•œ 후에 λΈŒλΌμš°μ €λ₯Ό ν†΅ν•΄μ„œ ν˜ΈμΆœν•˜λ©΄Β μ•„νŒŒμΉ˜ μ›Ή μ„œλ²„κ°€ μ‹€ν–‰ν•˜λ©° httpd_can_sendmailΒ  이 off μ΄λ―€λ‘œ μ›Ή μ„œλ²„μ˜ 둜그 νŒŒμΌμ—λŠ”Β λ‹€μŒκ³Ό 같은 였λ₯˜κ°€ λ‚¨μœΌλ©° μ œλŒ€λ‘œ λ™μž‘ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

sendmail: fatal: chdir /var/spool/postfix: Permission denied

μ•„νŒŒμΉ˜ μ›Ή μ„œλ²„μ˜ 둜그 νŒŒμΌμ€ 일반적으둜 /var/log/httpd 에 λ‚¨κ²Œ λ©λ‹ˆλ‹€.


이 문제λ₯Ό ν•΄κ²°ν•˜λ €λ©΄ httpd μ„œλ²„κ°€ 메일 μ„œλ²„μ— 접속할 수 μžˆλ„λ‘Β httpd_can_sendmailΒ  Β λΆˆλ¦°μ„ on 으둜 μ„€μ •ν•΄ μ£Όλ©΄ λ©λ‹ˆλ‹€.

μ„€μ • 변경은 setsebool λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜λ©° μ„€μ •ν•  뢈린λͺ…κ³Ό 1μ΄λ‚˜ true λ˜λŠ” 0 μ΄λ‚˜ false λ₯Ό μ§€μ •ν•˜μ—¬ ν•΄λ‹Ή λΆˆλ¦°μ„ ν™œμ„±ν™”/λΉ„ν™œμ„±ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.


μ•„λž˜ λͺ…령은 httpd_can_sendmail λ₯Ό true 둜 μ„€μ •ν•˜μ—¬ μ›Ή μ„œλ²„μ—μ„œ mod_php λ°©μ‹μœΌλ‘œλ„ 메일 전솑이 κ°€λŠ₯ν•˜κ²Œ μ„€μ •ν•©λ‹ˆλ‹€.

$ sudo setsebool httpd_can_sendmail true
뢈린 μ„€μ • on


이제 λ‹€μ‹œ λΈŒλΌμš°μ €μ—μ„œ mailtest.php 에 μ—°κ²°ν•˜λ©΄ 정상 λ™μž‘ν•˜μ—¬ 메일이 κ°€λŠ” 것을 확인할 수 μžˆμ„ κ²ƒμž…λ‹ˆλ‹€.


setsebool λͺ…λ ΉμœΌλ‘œ μ„€μ •ν•œ 뢈린 값은 μ§€μ†λ˜μ§€ μ•ŠμœΌλ©° μ„œλ²„λ₯Ό μž¬λΆ€νŒ…ν•˜λ©΄ κΈ°λ³Έ μ„€μ •μœΌλ‘œ λ˜λŒμ•„ 였게 λ©λ‹ˆλ‹€. λΆ€νŒ…μ‹œμ—λ„ μ„€μ •ν•œ λΆˆλ¦°μ„ μœ μ§€ν•˜λ €λ©΄ -P μ˜΅μ…˜(persistant)을 λΆ™μ—¬μ„œ μ‹€ν–‰ν•˜λ©΄ 되며 λ‹€μŒ λͺ…λ Ήμ–΄λŠ” μž¬λΆ€νŒ…ν•΄λ„ μ•„νŒŒμΉ˜ μ›Ή μ„œλ²„κ°€ sendmail μ„œλ²„μ— μ—°κ²°ν•  수 있게 μ„€μ •ν•©λ‹ˆλ‹€.

$ sudo setsebool -P httpd_can_sendmail true
뢈린 μ„€μ • μœ μ§€

뢈린 μ„€λͺ…을 μœ„ν•΄ μ›Ή μ„œλ²„μ˜ λͺ¨λ“ˆ λ°©μ‹μœΌλ‘œ λ™μž‘ν•  경우λ₯Ό 예둜 λ“€μ—ˆμ§€λ§Œ μ›Ή μ„œλ²„ λͺ¨λ“ˆ 방식은 μ•„ν‚€ν…μ²˜ 및 λ³΄μ•ˆμƒ 쒋은 선택이 μ•„λ‹ˆλ©° λ³„λ„μ˜ WAS(php-fpm, tomcat λ“±)둜 κ΅¬μ„±ν•˜κ³  μ›Ή μ„œλ²„λŠ” λ¦¬λ²„μŠ€ ν”„λ½μ‹œ λ°©μ‹μœΌλ‘œ μ—°κ²°ν•˜λŠ” 것이 λ³΄μ•ˆκ³Ό μ‹œμŠ€ν…œ ν™•μž₯ μΈ‘λ©΄μ—μ„œ μœ λ¦¬ν•©λ‹ˆλ‹€.

이에 λŒ€ν•΄ μžμ„Έν•œ μ„€λͺ…은 "μ›Ή μ„œλ²„ λ³΄μ•ˆ κ°•ν™”" μž₯μ—μ„œ λ‹€λ£Ήλ‹ˆλ‹€.