[Linux][CentOS][7.x] 간단한 SELinux 설정법
CentOS 설치 후에 어플리케이션 설치 및 설정 후 무언가 제대로 되지 않는다면 대부분 SELinux 설정 때문인 경우가 많습니다.
SELinux 에 대해서 알아보도록 하겠습니다.
SELinux란 Security-Enhanced Linux 의 줄임말로 보안이 향상된 리눅스라고 정의되어 있습니다.
보안과 사용자 편의는 양날의 검인지라, 보안이 향상되었다는 것은 무언가 사용하기 불편할 수 있다라는 의미입니다.
SELinux 상에서는 각 응용 프로그램에 대해서 접근이 가능한 설정 파일이나 사용할 수 있는 폴더의 위치에 대해서 권한이 명확하게 정의가 되었습니다.
예를 들자면 httpd 프로세스가 php 를 통해서 특정 경로에 파일을 write 하는 것도 SELinux context type이 맞아야만 가능합니다.
또한 mysql 의 DB 경로를 변경할 때에도 해당 폴더에 맞는 SELinux context type 이어야 가능합니다.
1. SELinux 기본
SELinux는 enforcing, permissive, disabled 세 가지 정책을 설정할 수 있습니다.
enforcing 의 경우 보안 정책을 적용하는 것이고, permissive 의 경우는 경고만 보여주고, disabled 는 아예 로딩하지 않는 것입니다.
그리고 targeted, minimum, mls 등의 타입을 지정할 수 있습니다.
targeted는 지정된 프로세스들을 보호하는 것이고, minimum 은 targeted 를 변형하여 선택된 프로세스만 보호하는 것이고, mls 는 여러 레벨로 보안을 설정하는 것입니다.
현재 설정을 확인하기 위해서는 getenforce 명령어를 사용합니다.
# getenforce |
그리고 임시 설정 변경을 위해서는 setenforce 명령어를 이용하면 됩니다. (리부팅시 원래 상태로 돌아옴)
SELinux 설정을 permissive 로 변경
# setenforce 0 |
SELInux 설정을 enforcing 으로 변경
# setenforce 1 |
영구적인 설정 변경을 위해서는 아래의 설정파일을 열어서 변경하면 됩니다.
# vi /etc/selinux/config |
2. chcon 을 이용한 context type 변경
SELinux 를 사용하지 않으면 설정에 문제는 사라지겠지만 보안이 약해지는 문제가 있습니다. 따라서 SELinux 를 적용한 상태에서 특정 폴더 혹은 파일의 context type 을 상황에 맞게 적용하는 방법에 대해서 설명 드리겠습니다.
이전에 mysql 설정 포스팅에서도 잠깐 소개되었었는데, mysql의 DB 경로를 변경하는 경우에 대해서 설명해 보겠습니다.
기본 경로 (/var/lib/mysql)를 /datadir 로 변경한다고 가정하면, 아래와 같이 새 DB 경로의 context 를 변경해 주면 mysql 프로세스가 사용이 가능한 권한을 얻게 됩니다.
# chcon --reference=/var/lib/mysql -R /datadir |
또한 php 프로세스가 httpd 상에서 파일 쓰기 권한이 필요하다면, 권한이 필요한 경로 (/var/www/html/phpfile) 에 다음과 같이 설정해 주면 됩니다.
# chcon -t httpd_sys_rw_content_t -R /var/www/html/phpfile |
3. SELinux 설정값 확인 및 변경
이번에는 getsebool / setsebool 명령어를 이용해서 SELinux 설정을 확인하고 변경해 보겠습니다.
httpd 프로세스에서 네트워크 연결 허용 여부를 결정하는 SELinux 설정은 httpd_can_network_connect 입니다.
아래와 같이 입력하여 현재 설정값을 확인해 봅니다.
# getsebool httpd_can_network_connect |
혹은 getsebool -a 후에 grep 으로도 확인할 수 있습니다.
위의 연결을 허용해 주고 싶으면 아래와 같이 입력하면 됩니다.
# setsebool -P httpd_can_network_connect on |
on 대신 1을 입력해도 됩니다.
반대로 연결을 허용하지 않겠다면,
# setsebool -P httpd_can_network_connect off |
off 대신 0을 입력해도 됩니다.
[PHP] 업로드 파일 크기 제한 조정하기
PHP 기본 설정에서는 보안상 한번에 업로드 되는 파일 크기를 2MB로 제한하고 있습니다.
이 제한 설정을 변경하기 위해서는 다음과 같이 합니다.
1. php.ini 파일을 vi 에디터 등으로 열어 봅니다. (Ubuntu 14.04 기준 기본 경로 - /etc/php5/apache2/php.ini)
> vi /etc/php5/apache2/php.ini |
2. upload_max_filesize 항목과 post_max_size 항목을 찾아서 원하는 값으로 변경합니다.
이름에서 알수 있듯이 upload_max_filesize 는 php 에서 업로드 할수 있는 최대 파일 크기이고 post_max_size 는 POST 방식으로 전송되는 업로드 파일의 최대 크기 입니다.
100MB로 크기를 변경한다면, 아래와 같이 적어 주면 됩니다.
upload_max_filesize = 100M |
파일 저장후 apache2 (혹은 httpd) 를 재시작하면 바로 적용이 됩니다.
[Linux] Ubuntu에서 php-oracle 작업 환경 셋업하기
1. install apache, mysql, php
sudo apt-get install tasksel
sudo tasksel install lamp-server
2. install oracle
apt-get install alien
alien -i oracle-xe-11.2.0-1.0.x86_64.rpm
3. edit TNS
vi /u01/app/oracle/product/11.2.0/xe/network/admin/tnsnames.ora
4. install php-pear
apt-get install php-pear php5-dev build-essential unzip libaio1
5. install oci
alien -i oracle-instantclient12.1-basic-12.1.0.1.0-1.x86_64.rpm
alien -i oracle-instantclient12.1-devel-12.1.0.1.0-1.x86_64.rpm
pecl install oci8
6. edit environment variable
echo ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe/ >> /etc/environment
7. edit php configuration
echo extension=oci8.so >> /etc/php5/apache2/php.ini
echo extension=oci8.so >> /etc/php5/cli/php.ini
8. edit apache2 envvars
vi /etc/apache2/envvars
# add this line
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe
9. restart apache
sudo /etc/init.d/apache2 restart
or
sudo service apache2 restart
참고자료
https://help.ubuntu.com/community/ApacheMySQLPHP
https://help.ubuntu.com/community/PHPOracle
http://kogentadono.com/2011/11/02/installing-oci8-on-ubuntu/
[PHP] fsockopen error - permission denied
CENTOS 6.4 / PHP 5.3.3
VBbulletin 사용 도중 서버 이전 후 메일이 발송되지 않는 문제가 발생해서 원인을 찾아보니,
로그에 아래와 같은 경고 메시지가 뜨면서 발송이 되지 않고 있었음.
Warning: fsockopen() [function.fsockopen]: unable to connect to ssl://smtp.google.com (Permission denied) in /xxxx.php on line xx
원인
대부분의 경우 리눅스 보안설정 SELinux 에서 httpd 에서 네트워크 커넥션을 허용하지 않는 경우이다.
해결책
커맨드 프롬프트에서 다음과 같이 입력
setsebool httpd_can_network_connect=1
(혹시 setsebool이 path가 결려있지 않은 경우 /usr/sbin/setsebool 을 이용)
[PHP] Gmail 첨부파일, 이미지 embed 시키기
PHP mail 보내기 - 파일첨부하기 / 이미지 보여주기
기본적인 메일 보내는 방법은 아래 링크 참고하세요.
http://shineum.tistory.com/56
1. 파일 첨부하기
$mail->AddAttachment("첨부파일 경로 혹은 파일 리소스", "첨부파일 이름"); // 해당 경로의 파일을 지정한 파일 이름으로 첨부
2. 메일에 이미지를 보여주기
- 보여줄 이미지를 유니크한 키를 사용해서 embeded image 로 추가를 해준다.
- embeded 할때 지정한 유니크 키를 src 태그를 사용해서 이미지 링크로 걸어준다.
$mail->AddEmbeddedImage("첨부파일 경로 혹은 파일 리소스", "유니크 키1");
$mail->AddEmbeddedImage("첨부파일 경로 혹은 파일 리소스", "유니크 키2");
$mail->MsgHTML("
<p><img src='cid:유니크 키1'></p>
<p><img src='cid:유니크 키2'></p>
");
[PHP] Gmail SMTP 를 이용하여 메일 보내기
PHPMailer 에 대한 새로운 사용법을 새로운 포스트에 남겨두었습니다. 참고하세요.
1. 다음 링크에서 필요한 모듈을 다운로드 받는다. (PHPMailer)
http://code.google.com/a/apache-extras.org/p/phpmailer/
개발자가 코드를 github 로 옮겼습니다. 아래 링크에서 다운로드 받으세요..
=> https://github.com/PHPMailer/PHPMailer
2. 다운로드 받은 파일을 적당한 경로에 압축을 푼다.
ex)
/var/www/html/inc/PHPMailer
3. 메일 보낼 코드 작성 예
/var/www/html/mailSample.php
<?php
require_once("inc/PHPMailer/class.phpmailer.php");
$mail = new PHPMailer(true);
$mail->IsSMTP();
try {
$mail->Host = "smtp.gmail.com"; // email 보낼때 사용할 서버를 지정
$mail->SMTPAuth = true; // SMTP 인증을 사용함
$mail->Port = 465; // email 보낼때 사용할 포트를 지정
$mail->SMTPSecure = "ssl"; // SSL을 사용함
$mail->Username = "GMAIL ACCOUNT"; // Gmail 계정
$mail->Password = "PASSWORD"; // 패스워드
$mail->SetFrom('from email address', 'Display Name'); // 보내는 사람 email 주소와 표시될 이름 (표시될 이름은 생략가능)
$mail->AddAddress('to email address', 'Display Name'); // 받을 사람 email 주소와 표시될 이름 (표시될 이름은 생략가능)
$mail->Subject = 'Email Subject'; // 메일 제목
$mail->MsgHTML("Email Content"); // 메일 내용 (HTML 형식도 되고 그냥 일반 텍스트도 사용 가능함)
$mail->Send(); // 실제로 메일을 보냄
echo "Message Sent OK<p></p>\n";
} catch (phpmailerException $e) {
echo $e->errorMessage(); //Pretty error messages from PHPMailer
} catch (Exception $e) {
echo $e->getMessage(); //Boring error messages from anything else!
}
?>
[PHP] POST 방식으로 데이터 전송하기
// usage
$url = "http://www.example.com/receiver.php";
$data = array("key" => "value");
$res = post_request($url, $value);
?>
[PHP] 엑셀 파일 읽기
[PHP] 백슬래시를 슬래시로 변경하는 코드
$text = preg_replace("/\\\\/", "/", $text);
[PHP] 날짜 관련 함수
function dateCompare($dt1, $dt2)