The Pursuit of Happyness

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을 입력해도 됩니다.






Comment +0

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
 post_max_size = 100M

파일 저장후 apache2 (혹은 httpd) 를 재시작하면 바로 적용이 됩니다.









Comment +0

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/



Comment +0

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 을 이용)





Comment +0

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>

");







Comment +0


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!

}

?>

 

 

 

Comment +1

<?php

function post_request($url, $data) {
// Convert the data array into URL Parameters like a=b&foo=bar etc.
$data = http_build_query($data);

// parse the given URL
$url = parse_url($url);

if ($url['scheme'] != 'http') {
return "Error:Only HTTP request are supported!";
}

// extract host and path:
$host = $url['host'];
$path = $url['path'];
$res = '';

// open a socket connection on port 80 - timeout: 300 sec
if ($fp = fsockopen($host, 80, $errno, $errstr, 300)) {
$reqBody = $data;
$reqHeader = "POST $path HTTP/1.1\r\n" . "Host: $host\r\n";
$reqHeader .= "Content-type: application/x-www-form-urlencoded\r\n"
. "Content-length: " . strlen($reqBody) . "\r\n"
. "Connection: close\r\n\r\n";

/* send request */
fwrite($fp, $reqHeader);
fwrite($fp, $reqBody);

while(!feof($fp)) {
$res .= fgets($fp, 1024);
}

fclose($fp);
} else {
return "Error:Cannot Connect!";
}

// split the result header from the content
$result = explode("\r\n\r\n", $res, 2);

$header = isset($result[0]) ? $result[0] : '';
$content = isset($result[1]) ? $result[1] : '';

return $content;
}

// usage
$url =  "http://www.example.com/receiver.php";
$data = array("key" => "value");
$res = post_request($url, $value);

?> 
 

Comment +0

구글코드에 있는 소스

http://code.google.com/p/php-excel-reader/


Comment +0


$text = preg_replace("/\\\\/", "/", $text);

Comment +0

strtotime 에서 2100년이 넘어갈때 제대로 처리하지 못하는 것은 다음의 코드를 응용해서 해결할수 있다.

function dateCompare($dt1, $dt2)
{
        $y1 = substr($dt1, 0, 4);
        $y2 = substr($dt2, 0, 4);

        if ($y1 > $y2) return -1;
        else if ($y1 < $y2) return 1;

        $startPos = 2;
        for($i=0;$i<5;$i++)
        {
                $startPos += 3;
                $v1 = substr($dt1, $startPos, 2);
                $v2 = substr($dt2, $startPos, 2);

                if ($v1 > $v2) return -1;
                else if ($v1 < $v2) return 1;
        }

        return 0;
}

function addYears($dt, $year)
{
        $yr = substr($dt, 0, 4);
        return ($yr + $year) . substr($dt, 4);
}

php

Comment +0