Bad Request

Your browser sent a request that this server could not understand.

Additionally, a 400 Bad Request error was encountered while trying to use an ErrorDocument to handle the request.

 

증상

1.apache 2.2 / php 소스 / 가상호스트 설정되어 사용중에 위와같은 에러 발생
2.가상호스트에 설정된 ErrorLog나 CustomLog 에 찍히지 않고 기본 가상호스트(제일 최상단)에 설정된 customlog에 400 get 로그만 찍힘(에러로그에는 안찍힘)

확인해보니 도메인 네임에 "_" 언더바가 들어가면 에러가 나는것 같다. _ > - 로 바꿔서 해보니 잘 나온다.

 

https://ma.ttias.be/apache-httpd-2-2-15-60-underscores-hostnames-now-blocked/

 

Apache httpd 2.2.15-60: underscores in hostnames are now blocked

A minor update to the Apache httpd project on CentOS 6 had an unexpected consequence. The update from 2.

ma.ttias.be

 

내용 정리하자면 아파치 centos 6 버전에서 아파치 2.2.15 이상부터는 rfc1123 기반하여 도메인네임에 _ 언더바(외국어로는 언더스코어(underscore)로 표현하는듯)를 허용하지 않는다고 한다.
https://access.redhat.com/errata/RHSA-2017:1721

 

Red Hat Customer Portal

요약 Moderate: httpd security and bug fix update 유형/심각도 Security Advisory: Moderate 주제 An update for httpd is now available for Red Hat Enterprise Linux 6. Red Hat Product Security has rated this update as having a security impact of Moderate. A Common Vulne

access.redhat.com

처리방법으로는

아파치 2.2.14 버전쓰던가
도메인네임 바꿔야 할듯..

 maxminddb 라는걸로 올릴 수 있는데 그거 하려면 뭐 gcc 랑 c++ 버전 이런게 centos 5버전에는 안맞는 버전들이다.

어쨋든 centos5 버전은 아래와 같이 하면 된다.

 

 

https://dev.maxmind.com/geoip/legacy/mod_geoip2/ 참고

 

GeoIP Legacy Apache Module « MaxMind Developer Site

GeoIP Legacy Apache Module New Apache Module Available: This module is for the GeoIP Legacy format (dat). To read the MaxMind DB format (mmdb) used by GeoIP2, please see mod_maxminddb Description The mod_geoip2 module embeds GeoIP Legacy database lookups i

dev.maxmind.com

 

설치순서는 대략적으로

1.geoip를 서버에 설치하고

2.geoip의 데이터를 넣어주고

3.설치된 geoip를 가지고 아파치용 geoip 모듈을 설치한다.

 

 

1.geoip-api-c-master.zip 다운로드 & 설치 

https://github.com/maxmind/geoip-api-c

geoip-api-c-master.zip
0.18MB

1-1. 파일 다운로드

1-2. 압축풀고 들어가서 ./bootstrap

ㄴ여기서 

~/src/apache_sadong/geoip-api-c-master]# /usr/local/bin/autoreconf -fiv
autoreconf: Entering directory `.'
autoreconf: configure.ac: not using Gettext
autoreconf: running: aclocal --force -I m4
autoreconf: configure.ac: tracing
autoreconf: configure.ac: not using Libtool
autoreconf: running: /usr/local/bin/autoconf --force
configure.ac:14: error: possibly undefined macro: AC_PROG_LIBTOOL
      If this token and others are legitimate, please use m4_pattern_allow.
      See the Autoconf documentation.
autoreconf: /usr/local/bin/autoconf failed with exit status: 1

위와같이 libtool 관련 에러 발생하면 libtool 이거 받아서 압축풀고 ./configure make make install 해서 설치

libtool-2.4.2.tar.gz
2.51MB

 

1-3./configure --prefix=/usr/local/geoip ;make ;make install

 

2.geoip 컨츄리 파일 받고 넣기
https://dev.maxmind.com/geoip/geoip2/geolite2/

ㄴ용량이 커서 업로드가 안됨, GeoLite2-City-CSV_날짜 파일 받으면됩니다.

2-1.일전에 geoip iptalbles 에 올리는걸로 컨버팅하는 스크립트 했었는데 이번 스크립트는 또 다른거다.

이번 버전은 파이썬 2.7버전에서 실행되는 스크립트다.(2.7 미만의 버전은 해당 스크립트 에러남)

# git clone https://github.com/sherpya/geolite2legacy

# cd geolite2legacy

# curl -O https://geolite.maxmind.com/download/geoip/database/GeoLite2-Country-CSV.zip

# ./geolite2legacy.py -i GeoLite2-Country-CSV.zip -f geoname2fips.csv -o GeoIP.dat

ㄴ이거 할 때 ipaddr 모듈 없다하면 pip install ipaddr 명령어로 설치해야한다.

깔끔하게 GEOIP.dat 파일이 생겼다.
geoip.dat 파일은 여기다가 한달에 한번정도 주기적으로 업로드를 해야겠다. 

 

GeoIP.dat
1.88MB

2-2.geoip.dat 파일을 /usr/local/GeoIP/share/GeoIP 여따가 넣어준다.

 

 

3.geoip-api-mod_geoip2-1.2.10.tar.gz 다운로드

geoip-api-mod_geoip2-1.2.10.tar.gz
0.01MB

3-1. 파일 다운로드 받고 압축풀고 해당 디렉토리로 들어가면 mod_geoip.c 가 있다. 해당 경로에서

[root@localhost ~/src/apache_sadong/geoip-api-mod_geoip2-1.2.10]# /home/apache/bin/apxs  -i -a -L /usr/local/GeoIP/lib -I /usr/local/GeoIP/include -l GeoIP -c ./mod_geoip.c 

이렇게 하면 아파치에 geoip 모듈 탑재 완료.

 

3-2. 이제 다 됐으면 특정 국가만 허용예시

GeoIPDBFile 이부분은 geoip db 파일을 뭘로 할꺼냐고 그 뒤에 flag 는 Standard  만 있는게 아니다.
MemoryCache / Standard / CheckCache / IndexCache 요렇게 4개가 있다.
메뉴얼에는 전부 MemoryCache 로 돼 있으니까 나도 MemoryCache  로 

각 플래그에 대한 설명은 https://dev.maxmind.com/geoip/legacy/mod_geoip2/ 참고

 

 

특정 국가에만 접근 허용

          <Directory /home>                  
                Options FollowSymLinks MultiViews
                AllowOverride FileInfo
                Order deny,allow  
                SetEnvIf GEOIP_COUNTRY_CODE KR AllowCountry
                Deny from all
                Allow from env=AllowCountry

</Directory>

 

 

ps.

아파치 어쎄스 로그에 국가코드 남기고 싶으면 로그 포멧을 아래로 하면됨
LogFormat “%V [%h] %u %t %D \”%r\” %>s %b \”%{Referer}i\” \”%{User-Agent}i\”   GeoIP_Address=\”%{GEOIP_ADDR}e\” Country_Code=\”%{GEOIP_COUNTRY_CODE}e\” Country_Name=\”{GEOIP_COUNTRY_NAME}e\”” vcommon

특정 디렉토리에 특정 아이피만 허용 


<Directory "/디렉토리/디렉토리/특정디렉토리">

    Order deny,allow           ### deny,allow 순서 중요함 여기서는 deny 정책 먼저하고 allow 정책을 나중에

    Deny from all               ###  all 을 deny 하고

    Allow from 1.1.1.1 2.2.2.2    ### 1.1.1.1 2.2.2.2 를 allow 해준다

</Directory>




반대로 특정 디렉토리에 특정 아이피만 제한할려면 


<Directory "/디렉토리/디렉토리/특정디렉토리">

    Order allow,deny           ### allow 정책을 먼저 써준다

    Deny from 1.1.1.1               ###  특정 1.1.1.1 deny 하고

    Allow from all    ### all을 allow 해준다.

</Directory>

cent os 4점대 apm 144 이전하는데


아파치 버전은 1.3


/usr/local/ 통째로 복사해서 이동하면 아파치 에러 남


에러 로그 내용은 Apache.pm failed to load!



펄 모듈 


/usr/lib/perl5/ 동기화하면 해결

 authn_file_module modules/mod_authn_file.so  문자파일을 이용한 사용자 인증

authn_dbm_module modules/mod_authn_dbm.so  DBM 파일을 사용한 사용자 인증 

authn_anon_module modules/mod_authn_anon.so  인증영역에 익명 사용자의 접근을 허용

authn_dbd_module modules/mod_authn_dbd.so  User authentication using an SQL database 

authn_default_module modules/mod_authn_default.so 최후 인증모듈  

authz_host_module modules/mod_authz_host.so  호스트를 사용한 그룹 권한부여  

authz_groupfile_module modules/mod_authz_groupfile.so 일반 문자파일을 이용한 그룹 권한부여  

authz_user_module modules/mod_authz_user.so  사용자 권한부여 

authz_dbm_module modules/mod_authz_dbm.so  DBM 파일을 사용한 그룹 인증  

authz_owner_module modules/mod_authz_owner.so  파일 소유자를 이용한 권한부여 

authz_default_module modules/mod_authz_default.so 최후 권한부여모듈 

auth_basic_module modules/mod_auth_basic.so  기본 인증 모듈 

auth_digest_module modules/mod_auth_digest.so  MD5 Digest Authentication 사용한 사용자인증 

dbd_module modules/mod_dbd.so    Manages SQL database connections  

dumpio_module modules/mod_dumpio.so   Dumps all I/O to error log as desired 

ext_filter_module modules/mod_ext_filter.so  응답 내용을 외부 프로그램으로 처리한 후 클라이언트로 보낸다  

include_module modules/mod_include.so   Server-parsed html documents (Server Side Includes)  

filter_module modules/mod_filter.so   Context-sensitive smart filter configuration module  

deflate_module modules/mod_deflate.so   내용을 클라이언트로 보내기 전에 압축한다  

log_config_module modules/mod_log_config.so  서버로의 요청을 로그에 기록한다  

log_forensic_module modules/mod_log_forensic.so  Forensic Logging of the requests made to the server  

logio_module modules/mod_logio.so   요청당 입출력 바이트수를 기록 

env_module modules/mod_env.so    CGI 스크립트나 SSI 페이지에 전달할 환경변수를 수정한다  

mime_magic_module modules/mod_mime_magic.so  매직 넘버를 이용한 문서 타입 지정 기능 cern_meta_module modules/mod_cern_meta.so   CERN 웹서버 메타파일 지원  

expires_module modules/mod_expires.so   지정한 기준에 따라 Expires와 Cache-Control HTTP 헤더를 생성  

headers_module modules/mod_headers.so   HTTP 요청 헤더와 응답 헤더 수정  

ident_module modules/mod_ident.so   RFC 1413 ident 검색  

usertrack_module modules/mod_usertrack.so  Clickstream logging of user activity on a site  

unique_id_module modules/mod_unique_id.so  각 요청마다 유일한 식별자를 가지는 환경변수를 제공한다  

setenvif_module modules/mod_setenvif.so   요청의 성격에 따라 환경변수 설정을 변경한다  

version_module modules/mod_version.so   버전별 설정  

ssl_module modules/mod_ssl.so    Strong cryptography using the Secure Sockets Layer (SSL) and Transport Layer Security (TLS) protocols 

mime_module modules/mod_mime.so    Associates the requested filename's extensions with the file's behavior  (handlers and filters) and content (mime-type, language, character set and encoding)  

dav_module modules/mod_dav.so    Distributed Authoring and Versioning (WebDAV) 기능  

status_module modules/mod_status.so   서버 활동과 성능에 대한 정보를 제공한다  

autoindex_module modules/mod_autoindex.so  자동으로 유닉스의 ls 명령어나 Win32의 dir 쉘명령어와 유사한디렉토리 목록을 만든다 

asis_module modules/mod_asis.so    HTTP 헤더를 포함한 파일을 보낸다  

info_module modules/mod_info.so    서버 설정에 대한 종합적인 정보를 보여준다  

cgid_module modules/mod_cgid.so    외부 CGI 데몬을 사용하여 CGI 스크립트를 실행  

dav_fs_module modules/mod_dav_fs.so   mod_dav을 위한 파일시스템 제공자  

vhost_alias_module modules/mod_vhost_alias.so  Provides for dynamically configured mass virtual hosting negotiation_module modules/mod_negotiation.so  Provides for content negotiation  

dir_module modules/mod_dir.so    "마지막 슬래쉬" 리다이렉션을 제공하고 디렉토리 index 파일을 서비스한다  

imagemap_module modules/mod_imagemap.so   서버측 이미지맵(imagemap) 처리  

actions_module modules/mod_actions.so   이 모듈은 미디어종류나 요청메서드에 따라 CGI 스크립트를 실행한다 

speling_module modules/mod_speling.so   사용자가 대소문자를 잘못 사용하거나 맞춤법이 틀리는 것을 한번까지 허용하여 잘못된 URL을 고치려고 시도한다 

userdir_module modules/mod_userdir.so   사용자별 디렉토리  

alias_module modules/mod_alias.so   파일시스템의 다른 부분들을 문서 계층구조에 포함하고, URL 리다이렉션을 제공한다  

rewrite_module modules/mod_rewrite.so   Provides a rule-based rewriting engine to rewrite requested URLs on the fly


펌 : http://geenie.tistory.com/57



mod_access : 클라이언트 호스트명이나 IP주소로 접근을 제어합니다. 이걸 없애면 Order allow,deny 및 Allow from all 과 같은 옵션을 사용할 수 없으며, 따라서 mod_auth 모듈도 사용할 수 없습니다. mod_auth를 사용하지 않는다면 필요없겠죠.


mod_alias: URL을 매칭합니다. 


mod_autoindex: 디렉토리 목록을 출력합니다. (보안상 이유로) 없애고자 한다면, IndexOptions, HeaderName, ReadmeName, DefaultIcon, AddIcon, IndexIgnore 등의 옵션도 주석처리하십시오.


mod_auth: .htaccess 파일을 이용한 사용자 인증


mod_cgi: CGI 실행을 위해 필요합니다. PHP모듈만 사용하고 CGI를 사용하지 않는다면 물론 필요하지 않습니다.


mod_dir: 필수모듈. 기본적인 디렉토리 처리를 합니다. (Directory Inde옵션)


mod_log_config: 필수모듈. 로그파일을 기록합니다.


mod_mime: 필수모듈. 파일확장자에 따라 문서유형을 파악합니다. (AddType, AddHandler 옵션)


mod_vhost_alias: 가상호스트를 설정합니다. 개인PC에는 필요없겠죠.


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

2. 주로 사용하지 않는 모듈


mod_actions: Action, script 옵션을 사용해 스크립트를 실행합니다. AddHandler로 cgi를 실행하는 것과 관계없습니다.


mod_auth_anon,

mod_auth_dbm,

mod_auth_digest : 인증과 관련한 모듈입니다.


mod_asis: HTTP 헤더가 들어있는 asis 파일을 처리합니다.


mod_cern_meta: HTTP 헤더 메타파일을 처리합니다.


mod_env: CGI에 넘겨주는 환경변수를 변형합니다. (PassEnv, SetEnv 옵션)


mod_expires: Expires 헤더를 적용합니다. (ExpiresDefault, ExpiresByType 옵션)


mod_headers: HTTP 헤더를 사용자정의할 때 씁니다. PHP에서 header() 함수 쓰는 것과 상관없습니다.


mod_ext_filter: 외부 프로그램을 사용할 경우.


mod_imap: 서버 차원의 이미지맵 파일(imap-file) 처리. 


mod_include: SSI 문서(.shtml) 처리를 하려면 필요합니다 


mod_info: 서버 정보 (/server-info 사용할때)


mod_mime_magic: 확장자 대신 유닉스file 명령을 이용해 문서유형을 파악합니다.


mod_negotiation: 어떤 문서를 보여줄지 선택하죠. LanguagePriority, MultiView 등의 옵션과 관련되어있습니다.


mod_rewrite: 정규식을 이용한 URL 매핑. 이걸 필요로 하는 PHP 스크립트도 있습니다.


mod_setenvif: 클라이언트정보에 따라 REMOTE_HOST, USER_AGENT 등의 환경변수를 받아옵니다. 즉 로그를 기록할때나 BrowserMatch 옵션을 사용할 때는 필요합니다. 이게 없어도 php에서 REMOTE_ADDR 등을 사용하는데는 문제 없습니다.


mod_speling: URL의 철자법 오류 수정


mod_status: 서버 상태 표시 (/server-info 사용할때)


mod_userdir: 사용자 홈 디렉토리 설정. UserDir 옵션(/~ID)을 사용하려면 필요합니다.


mod_usertrack: 로그에 사용자 쿠키를 남길 때 사용합니다.


http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=19935

설치방법 : 컴파일 옵션에다가 --enable-log-forensic=shared 추가하면 된다.




httpd.conf 에는 








LoadModule log_forensic_module modules/mod_log_forensic.so 요거 추가해주고


ForensicLog logs/forensic_log 요거 추가해준다




로그포멧은


LogFormat "%{forensic-id}n %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined




뭐랄까 모르겠다 .아직가지 효용성은

모드 씨큐리티 로그 분석 / 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 나 낫 파운드는 어차피 파일이 없는거기 때문에 정상적인 접근일 수 가 없다.




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

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

mod_xsendfile 설치하기


wget https://tn123.org/mod_xsendfile/mod_xsendfile-0.12.tar.gz


다운받고


압축풀고


들어가서 apxs -cia xsendfile파일이름 하면 알아서 다 됨


그리고 아파치 재시작하고 


apachectl -M 해서 잘 올라왔나 확인

LogFormat "%h %l %u %T %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %P" combined


+ Recent posts