엔진엑스-php 연동(즉 아파치 대신 엔진엑스를 사용하기)




1.mysql 설치


ㄴ엔진엑스-php 연동이랑은 상관없이 mysql 설치




2.엔진엑스 설치


ㄴ아파치 설치하듯이 엔진엑스 설치, 컴파일 옵션은 지라같은데 검색해보면 몇개 나올듯 혹은 엔진엑스 설치돼있는 서버 수소문해서 옵션 고대로 해도 되고... 사실 옵션이 그닥~중요하진 않음 고객사에서 요청한 옵션이 없는이상


꼴리는대로 해주면 됨




3.php 설치(엔진엑스 연동하기 위해서 php-fpm을 추가해줘야함)


ㄴ우리가 apm 설치할때 사용하는 옵션을 사용 , 단 옵션중에 추가/삭제해야할 옵션이 있음


빼야할꺼는 "--with-apxs2=/opt/apache/bin/apxs"   당연히 아파치 연동이 아니기 때문에


추가할꺼는 --enable-fpm --with-fpm-user=daemon --wtih-fpm-group=daemon   (with-ftpm user/group 옵션은 엔진엑스가  어떤 유저/그룹으로 올라오는지 보고 해야함. 엔진엑스 실행시키고 ps -ef 로 확인)






4.php-fpm 실행


4-1. /opt/php/etc/ 들어가면 php-fpm 관련 설정파일 수정적용후


ㄴ mv php-fpm.conf.default php-fpm.conf




 php-ftpm 실행


 /opt/php/sbin]# ./php-fpm 








 /opt/php/sbin]# ./php-fpm 


[01-Aug-2017 11:59:41] WARNING: Nothing matches the include pattern '/opt/php/etc/php-fpm.d/*.conf' from /opt/php/etc/php-fpm.conf at line 125.


[01-Aug-2017 11:59:41] ERROR: No pool defined. at least one pool section must be specified in config file


[01-Aug-2017 11:59:41] ERROR: failed to post process the configuration


[01-Aug-2017 11:59:41] ERROR: FPM initialization failed




에러 발생시






읽어보면 pool이 없다.  pool section을 설정해라 뭐 이런말인데  (warning은 무시해도 되는 메세지인데 여기서는 무시하면 안됨. 아래 내용 한번 더 읽어보면 알겠지만 결국은 설정파일을 못찾아서 나오는 문제였으니까)




 /opt/php/etc]# pwd


/opt/php/etc


/opt/php/etc]# ll php-fpm.conf


-rw-r--r-- 1 root root 4430 2017-08-01 11:38 php-fpm.conf




위 파일이 php-fpm.conf 실행할때 참조되는 설정파일이고 파일 내용 제일 밑에보면 아래 내용 있다.




include=/opt/php/etc/php-fpm.d/*.conf 




들어가보면 




 /opt/php/etc/php-fpm.d]# ll


total 20


-rw-r--r-- 1 root root 18500 2017-08-01 11:38 www.conf.default




위에 내용처럼 설정파일이 없어서 에러가 난다. 




mv www.conf.default www.conf




php-fpm 실행


root     24891     1  0 12:46 ?        00:00:00 php-fpm: master process (/opt/php/etc/php-fpm.conf)


daemon   24892 24891  0 12:46 ?        00:00:00 php-fpm: pool www


daemon   24893 24891  0 12:46 ?        00:00:00 php-fpm: pool www




올라온거 확인




5.php/엔진엑스 연동


nginx.conf 수정


[root@q353-0921 ~]# vi /opt/nginx/conf/nginx.conf




        location ~ \.php$ {


            root           html;


            fastcgi_pass   127.0.0.1:9000;


            fastcgi_index  index.php;


            fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;


            include        fastcgi_params;


        }




위 부분 주석 해제(원래 주석돼있음, 너는 location 을 주석 해제 안했었어)






그리고 nginx 재시작


killall -9 nginx (또는 /opt/nginx/sbin/nginx -s reload //요거는 아파치graceful 같은ㄱ0


ㄴ엔진엑스는 nginx stop start restart 가 없음 그래서 구글같은데서 nginx 실행 스크립트라고 치면 많이 나오는데 그거 넣어주면됨)






php 정상 연동확인을 위한 info.php 파일 생성후 브라우저에서 아이피/info.php 접속


엔진엑스의 기본 홈 디렉토리는 /opt/nginx/html


ㄴ엔진엑스 nginx.conf  ㅇ안에 보면 아래처럼 root html 이 있는데 이게 root 디렉토리는 html 로 설정


        location / {


            root   html;


            index  index.html index.htm;


        }


ㄴ엔진엑스 통합관리 들어왔으니까 아파치처럼 가상호스트 추가하고 그런것정도는 알아둬야할듯






브라우저 접속시 아래 에러 발생


File not found. 




에러로그 확인해보면


2017/08/01 13:14:35 [error] 26172#0: *34 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 123.140.249.62, server: localhost, request: "GET /info.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "175.126.232.152"




Primary script unknown" while reading response header from upstream 요게 키포인트 인듯하다.


프라이머리 스크립트를 알수없다 ? 뭐 그런뜻인데 잘 모르겠으니까 구글링 검색




https://www.lesstif.com/pages/viewpage.action?pageId=24444977 여기보면 해결법이 나온다.




#           fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;


            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;




주석돼있는 부분이 fastcgi_param 즉 fastcgi_파라미터 를 어디를 참조할꺼냐 ? 뭐 그런거같은데 기존에는 /script로  돼있다. 이걸 위와같이 바꾸면 ($document_root 라는 함수는 아마도 홈디렉토리인 html 디렉토리를 가르킬듯)




아이피/info.php 접속해보면 phpinfo페이지 잘 뜸

'job > linux' 카테고리의 다른 글

히스토리, 명령어 저장등 script  (0) 2018.08.31
centos 6 xtables 설치시 에러  (0) 2018.08.31
vi 명령어 옵션  (0) 2018.08.31
libphp5.so: undefined symbol: unixd_config  (0) 2018.08.31
iptables 차단 정책 로그 쌓기  (0) 2018.08.31

퍼옴


http://linuxstory1.tistory.com/entry/SED-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%82%AC%EC%9A%A9%EB%B2%95



[스트림 편집기(SED)]

 

ed명령어와 grep명령어 기능의 일부를 합친 것이 sed(stream editor)명령어이다. sed명령어도 grep명령어와 같은 필터이지만 이 명령어는 파일을 수정할 수 있게 하는 반면 ed처럼 대화식처리는 불가능하다. sed명령어는 1개 라인씩 입력 라인을 읽어들여 표준출력으로 출력한다.

 

sed는 각 라인을 읽을 때마다 ed에서 사용하던 형식의 대치작업을 실행한다. 일치하는 문자열이 있으면 그 문자열을 대치한 후 출력하고 일치하는 문자열이 없으면 그 라인은 수정되지 않고 그대로 출력된다.

 

이 sed명령어가 ed보다 좋은 점은 라인들을 하나씩 읽고, 수정하고, 출력하기 때문에 기억장치 안의 버퍼를 사용하지 않는다는 것이다. 버퍼를 사용하지 않으면 파일의 크기에 제한 없이 작업을 할 수 있다. ed와 같이 버퍼를 사용하는 경우는 버퍼의 크기보다 큰 파일은 처리할 수 없으며 대개 버퍼의 크기는 1MB정도이다. 따라서 sed는 아주 큰 파일을 처리할 때 주로 사용된다.

 

sed 명령어를 호출하는 형식은 grep명령어와 같지만 완전한 형식의 대치 연산자를 사용한다는 점만이 다르다.

 

 

[sed 명령어 사용법]

 

----------------
치환(substitute)
----------------
sed 's/addrass/address/' list.txt
 : addrass를 address로 바꾼다. 단, 원본파일을 바꾸지 않고 표준출력만 한다.

 

sed 's/\t/\ /' list.txt : 탭문자를 엔터로 변환

 

------------
삭제(delete)
------------

sed '/TD/d' 1.html : TD 문자가 포함된 줄을 삭제하여 출력한다.

sed '/Src/!d' 1.html : Src 문자가 있는 줄만 지우지 않는다.

sed '1,2d' 1.html : 처음 1줄, 2줄을 지운다.

sed '/^$/d 1.html : 공백라인을 삭제하는 명령이다. (★★★)

 

--------------------------

sed 명령어의 다양한 사용예제

--------------------------

1. 특정문자열 바꾸기

 

2. 특정문자열이 포함된 행 삭제하기

 

 

3. 특정 문자열이 포함된 행에서 특정문자만 삭제하기

 

 

4. 파일의 일부만 편집해야 할 경 라인의 범위를 지정하여 사용 가능

 

5. 라인 번호 대신 문맥을 범위로 지정한 경우

 또한 문자열 goodbye를 만난 이후에도 다시 다른 hello가 등장하면 다음 goodbye가 나올 때까지 대치 작업은 반복된다.

 

6. 세번째 라인을 삭제

     
 7. hello 문자가 들어있는 line만 프린트

 

 8. 모든 line 출력과 동시에 hello line이 중복해서 나타남

 

9. princess 또는 Princess를 포함하고 있는 라인들을 삭제함

   

10. 라인 1부터 hello를 포함하고 있는 첫번째 라인까지 모든라인들을 삭제함

 

 11. datafile 안의 데이터로부터 처음 세 개의 문자들을 삭제

 

 12. datafile 안의 데이터로부터 마지막 세 개의 문자들을 삭제

 

13. 각 라인의 첫 번째 공백에서부터 마지막까지 삭제

 

14. 각 라인의 처음부터 맨 마지막 공백까지 삭제

 

15. 각 라인의 처음부터 : 문자가 있는 곳(:문자포함)까지 삭제

 

 

[sed 명령 하이라이트]

 

1. 각 라인마다 뒤에 Hello World! 문자를 입력

 

2. 3번재라인 뒤에 Good Morning 문자 삽입

 

3. 기존의 라인들을 Oh! My God!!! 문자로 대체시킴

 

4. q명령은 편집기로 하여금 그것이 명시된 라인에 도착한 뒤 중지하게 한다. 즉, 이 예제에서는 2라인만 보여주고 중지한다.

5. 특정라인의 문자 치환

※ 특정문자 전체를 바꾸려면 sed 's/hello/#####/g' datafile 과 같이 사용


/^$/   

공백라인, 즉 라인의 시작과 끝 사이에 아무것도 없는 라인과 부합한다. 이것은 공백 스페이스들로 된 라인과는 부합하지 않는바, 스페이스 자체가 문자이기 때문이다.

 

 

[간단한 sed 해법]

 

1.  모든 공백 라인 제거

      ※ sed '/^ *$/d' --> space로 만들어진 공백까지 제거

                                      (조심! ^와 *사이에 공백이 있어야 한다)

2. 각 line마다 공백라인 추가

 

 3. 각 line의 시작을 5 space로 대체

 

 

[sed 명령어의 또다른 기능]

sed명령어의 -f(file)선택자를 사용하면 명령어를 일일이 키보드에서 입력하지 않고 하나의 파일에 기억시켜 놓고 사용할 수도 있다.

 

     # sed -f command.file in.file

 

여러 개의 명령어를 연속적으로 자주 사용할 때 이 명령어 파일이 유용하게 사용된다.
예를 들어 다음과 같은 복수 개의 명령어가 파일에 기억되어 있는 경우는

     # vi command.file
       s/hello/goodbye
       s/good/bad

 

  다음과 같은 명령어를 입력하면 다음과 같이 출력된다.

     # echo "1234hello5678" | sed -f command.file
       => 1234badbye5678

모드 씨큐리티 로그 분석 / mod security mod_security log analysis


색깔 칠한 부분만 보면된다.


###파란색 글씨###

딱 보면 알겠지만 로그가 쌓일때 로그 ID이다. 

a~f / 0~9  8자리 랜덤 조합 그 뒤에 A, B, F, Z 등은 시간,접근방법, 탐지된 정책등의 정보가 담겨있다. 

SecAuditLogParts "ABIFHZ"  모드시큐리티 설정에 있다.

추가로

SecAuditLogRelevantStatus "^(?:5|4\d[^4])"  설정을 통해 404 등의 쓸때없는 페이지는 로그를 안 쌓을 수 있다.


###빨간색 글씨###

중요한 부분이다. 어떤식으로 접근했을때 탐지되었는지 알 수 있다.


###초록색 글씨###

어떤 정책에서 걸렸는지 알 수 있다. 



자세한건 로그 보면서 적겠지만 요약하자면


1.운영중인 홈페이지인 경우 2~4주정도의 탐지기간을 거쳐 로그를 검토하여 차단모드로 변경
ㄴ이유는 정상적인 접근도 차단 될 수 있기 때문이다. 

ㄴ만약 개발중인 사이트라면 처음부터 차단모드로 해놓고 안되는것들은 소스를 수정 & 정책을 주석하면 된다.


2.로그 분석은

먼저 파랑색 부분에서 동일한 로그끼리 보고 
빨간색 부분 체크하여 정상/비정상 유무 판단, (본인이 못하면 관리자, 개발자, 홈페이지 운영자등이 확인 가능)

정상이라면 초록색 부분에서 정책적용되지 않도록 해당 라인을 주석 / 비정상이라면 걸려서 접근 안된거니까 냅두면되고..





--892b4e44-A--   접근 시간 / 아아피등의 정보

[11/Aug/2017:13:44:57 +0900] WY02SX8AAAEAAAucFrcAAAAa 0.0.0.0 49410 0.0.0.0 443

--892b4e44-B-- 접근 URL 

GET /test/test.html?jb_type=G&ipZe%3D6199%20AND%201%3D1%20UNION%20ALL%20SELECT%201%2C2%2C3%2Ctable_name%20FROM%20information_schema.tables%20WHERE%202%3E1--%20..%2F..%2F..%2Fetc%2Fpasswd HTTP/1.1




Host: rsync.net

Connection: keep-alive

Upgrade-Insecure-Requests: 1

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8

Accept-Encoding: gzip, deflate, br

Accept-Language: ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4

Cookie: ACEUCI=1; PHPSESSID=a68fb899645d3c714231582cdd838ede; new_connect=0.0.0.0; ACEFCID=UID-598BEEBEC8E8787061A4F93F; ACEUCI=1; wcs_bt=s_23983

7b585db:1502424521

###Cookie 부분에서 php 세션 아이디 확인 가능### 만약 비정상적인 접근이라면 아이피확인하여 차단시켜도 좋다.


--892b4e44-F--

HTTP/1.1 200 OK    

###이부분 체크해야한다. 404 인지 400인지 혹은 200인지...  404나 403 처럼 파일이 없거나 퍼미션 denied 면 어차피 접근이 안된거라 상관없겠지만 200 이면 접근이 돼기는 했다는 거

X-Powered-By: PHP/5.2.17

Expires: Thu, 19 Nov 1981 08:52:00 GMT

Cache-Control: no-cache, must-revalidate

Pragma: no-cache

P3P: CP="NOI CURa ADMa DEVa TAIa OUR DELa BUS IND PHY ONL UNI COM NAV INT DEM PRE"

Access-Control-Allow-Origin: *

Access-Control-Allow-Methods: POST, GET, OPTIONS

Access-Control-Allow-Headers: X-Requested-With, X-Prototype-Version

Keep-Alive: timeout=30, max=1000

Connection: Keep-Alive

Transfer-Encoding: chunked

Content-Type: text/html; charset=utf-8


--892b4e44-H--

Message: Warning. Pattern match "/etc/passwd" at REQUEST_URI. [file "/usr/local/apache/conf/mod_security.conf"] [line "300"]

##어느 정책에 걸렸는지 확인 가능하다. 위 내용은 /etc/passwd 라는 패턴이 URL에 들어가서 mod_security.conf 파일의 300째 라인의 정책에 탐지됐다는 내용

Message: Warning. Pattern match "\.\./" at REQUEST_URI. [file "/usr/local/apache/conf/mod_security.conf"] [line "306"]

##마찬가지로 URL에 ../ 라는 특문이 포함돼있어 306 라인의 정책에 탐지됐다.


Stopwatch: 1502426697568606 27545 (118 559 -)

Producer: ModSecurity for Apache/2.5.12 (http://www.modsecurity.org/).

Server: Apache/2.2.29 (Unix) mod_ssl/2.2.29 OpenSSL/1.0.1e-fips DAV/2 PHP/5.2.17


--892b4e44-Z--


위 로그를 정리하자면


http://naver.com/../../../etc/passwd 로 접속했기 때문에 ../ 와 /etc/passwd 두가지 정책에 걸려서 로그가 쌓인거다. 
보통 도메인 홈디렉토리는 /home/계스트명/www 처럼 어느정도 유추가 되기 때문에(실제 절대 경로도 확인 할 수 있음) 위와같이 http://naver.com/../../../etc/passwd 도메인을 접속하게 되면 서버에서는

/home/계스트명/www/../../../etc/passwd 파일을 확인 할 수 있다.





######################

#!/bin/sh


err_num1=`grep "HTTP/1.1 404 Not Found" 2017.log_line | awk '{print $1}'`



for i in $err_num1;

do


err_num=`expr $i - 1`


sed -n  $err_num'p' 2017.log >> err_name1.txt

done


ERR=`cat err_name.txt`


for i in $ERR; do


echo $i


ERR_Z=`echo -ne "--"$i"-Z--"`

ERR_A=`echo -ne "--"$i"-A--"`



echo $ERR_Z 

echo $ERR_A



sed -i "/$ERR_A/,/$ERR_Z/d" 2017.log



done

#########


위 스크립트는 불피요한 로그들 삭제하는거 

404 나 낫 파운드는 어차피 파일이 없는거기 때문에 정상적인 접근일 수 가 없다.




사실 모드시큐리티 로그는 비정상적인 접근을 확인하고 해당 아이피를 차단하는것도 있겠지만

그것보다는 정상적인 접근을 확인해서 서비스중인 홈페이지에 장애가 되지 않도록 설정하는데 더 의미가 있다고 봄

'job > apache' 카테고리의 다른 글

apache 오래된 버전 이전  (0) 2018.09.03
아파치 모듈 설명  (0) 2018.09.03
apache module forensic log 설정  (0) 2018.08.31
mod_xsendfile 설치 하기  (0) 2018.08.31
아파치 로그에 PID 쌓기  (0) 2018.08.31

+ Recent posts