쟝이의 세상
추가 보안 적용 (Ubuntu) 본문
Ubuntu에서 웹 서버(Apache) 대표적인 설정 파일
- Apache의 전반적인 설정을 담고 있는 파일 : /etc/apache2/apache2.conf
- 모듈 설정 파일 : /etc/apache2/mods-available 및 /etc/apache2/mods-enabled
- 사이트별 설정 파일 : /etc/apache2/sites-available 및 /etc/apache2/sites-enabled
→ IIS의 applicationHost.config 파일은 하나의 파일에 IIS 서버 모든 설정을 담고 있지만,
우분투의 웹 서버 환경에서는 이러한 설정이 여러 개의 파일과 디렉터리로 나뉘어 관리된다.
GET, POST 제외한 다른 메소드 모두 비활성화
1) /etc/apache2/apache2.conf 설정
설정해줘야 하는 부분은 <Directory /var/www/html>
위 <Directory /var/www/> 에서 Require all granted 가 되어있어야 /var/www/ 의 하위 디렉토리까지 모두 적용된다.
적용 후에 "sudo systemctl restart apache2" 꼭 해주기
2) curl 명령어로 HTTP 요청
$ curl -X DELETE http://(domain 이름)/board2/login2.php
$ curl -X PUT http://(domain 이름)/board2/login2.php
$ curl -X TRACE http://(domain 이름)/board2/login2.php
HTTP 요청을 특정 메소드(DELETE, PUT, TRACE)로 수행
→ 웹 서버와의 HTTP 통신을 테스트하는 용도
403 또는 405 에러 뜨면 비활성화 된 것임!
파일의 접근 제어 설정
1) robots.txt 파일 설정
위치: /var/www/html/robots.txt
텍스트 파일 생성하여 필요한 내용 삽입
robots.txt
: 웹 사이트에서 크롤링하며 정보를 수집하는 검색 엔진 크롤러(검색 로봇)가 액세스하거나 정보수집을 해도 되는 페이지와 안 되는 페이지가 어떤 것인지 알려주는 텍스트 파일
#Google을 위한 규칙
User-agent: googlebot
#Disallow: /admin
Disallow: ./board/dbconn.php
Disallow: ./board2/dbconn2.php
#모든 검색 로봇을 위한 규칙
User-agent: *
#Disallow: /admin
Disallow: ./board/dbconn.php
Disallow: ./board2/dbconn2.php
dbconn.php(데이터베이스 연결) 파일 차단하기
- 민감한 정보 보호
- 자동화된 공격 방지
→ 악의적인 크롤러나 봇은 서버를 스캔하면서 취약한 파일을 찾아낸다. - 로봇에 의한 인덱싱 방지
→ 검색 엔진에 의해서 데이터베이스 연결 파일이 인덱싱되면 파일이 노출될 가능성이 커진다.
robots.txt 파일은 보안 기능이라기 보다는 크롤러에게 지침을 제공하는 용도로 사용되어
누구나 접근 가능하며, 웹 브라우저에서 내용을 확인할 수 있다.
2) apache2.conf 파일 설정
서버 전체에 대한 접근 제어를 설정하기 위해 apache2.conf 파일 사용
<Directory "/var/www/html/board">
<Files "dbconn.php">
Require all denied
</Files>
</Directory>
<Directory "/var/www/html/board2">
<Files "dbconn2.php">
Require all denied
</Files>
</Directory>
board 디렉토리의 dbconn.php와 board2 디렉토리의 dbconn2.php
두 파일 모두 접근이 불가능하도록 설정
접근 제어한 파일로 접근할 경우 Forbidden 으로 접근이 불가능하다고 화면에 출력됨을 확인
응답 헤더 설정을 통해 XSS 방지
1) apache2.conf 파일 설정
- X-XSS-Protection: 1; mode=block
: XSS 필터링 사용, 공격이 탐지되면 안전하지 않은 영역을 제거하는 것이 아닌 페이지 렌더링을 중단
서버 전체에 적용되도록 하는 방법 사용
→ mod_headers 모듈이 활성화되어 있을 때만 헤더 설정을 적용한다.
특정 가상 호스트에만 적용할 때
: 해당 가상 호스트의 설정 블록 안에 추가
<VirtualHost *:80> ServerName example.com DocumentRoot /var/www/html <IfModule mod_headers.c> Header set X-XSS-Protection "1; mode=block" </IfModule> </VirtualHost>
특정 디렉토리에만 적용할 때
: <Directory> 블록 안에 설정 추가<Directory /var/www/html/board2> <IfModule mod_headers.c> Header set X-XSS-Protection "1; mode=block" </IfModule> </Directory>
→ 적용한 후 apache 서버 재시작
" sudo systemctl restart apache2 "
2) mod_headers 모듈 활성화
#mod_headers 모듈 활성화
$ sudo a2enmod headers
#mod_headers 모듈 비활성화
$ sudo a2dismod headers
웹 응용 프로그램 방화벽 모듈 사용
1) modsecurity 설치
$ sudo apt-get install libapache2-mod-security2
< 설치 확인 방법 >
⓵ apachectl -M
$ apachectl -M | grep security
⓶ phpinfo()
→ mod_security2 확인
2) modsecurity 설정
⓵ modsecurity.conf 파일 수정 전 해당 파일을 복사하여 이름 변경해준다.
$ cd /etc/modsecurity
$ sudo cp modsecurity.conf-recommended modsecurity.conf
modsecurity.conf
: ModSecurity의 기본 설정을 포함하는 주요 구성 파일이다.
이 파일에서 ModSecurity의 전반적인 동작과 설정을 조정할 수 있다.
(이 파일은 ModSecurity 모듈이 Apache 웹 서버와 통합될 때 중요한 역할을 한다.)
⓶ modsecurity.conf 파일 수정
→ SecRuleEngine DetectionOnly 주석처리 후 SecRuleEngine On 추가
SecRuleEngine 옵션 값
1. SecRuleEngine On:
- ModSecurity 완전히 활성화
- 공격 패턴 감지 시 차단하거나 로그를 남김
- 공격 감지 시 서버가 요청을 차단하고, 해당 요청은 실행되지 많음
- ModSecurity가 보안 필터로 작동하는 모드
2. SecRuleEngine DetectionOnly:
- ModSecurity 탐지 모드로 동작
- 공격 패턴 감지 시 로그를 기록하지만, 요청은 차단되지 않음
- 어떤 공격이 들어오는지 모니터링 가능
3. SecRuleEngine Off:
- ModSecurity 비활성화
- WAF 동작 X, 규칙 평가 X
⓷ OWASP Top 10을 포함한 공격을 막기 위한 Rule Set 설치
- 먼저 Rule Set 다운로드
$ wget https://github.com/coreruleset/coreruleset/archive/v3.3.4.tar.gz
- Rule Set 압축 해제
$ tar -xvf v3.3.4.tar.gz
- Rule Set 디렉토리 생성 및 이동
# 디렉토리 생성
$ mkdir /etc/apache2/modsecurity-crs
# 압축 해제한 Rule Set를 생성한 디렉토리로 이동
$ mv ./coreruleset-3.3.4/ /etc/apache2/modsecurity-crs/
# Rule Set 디렉토리로 이동
$ cd /etc/apache2/modsecurity-crs/coreruleset-3.3.4/
# 파일 이름 변경
$ mv crs-setup.conf.example crs-setup.conf
- security2.conf 파일 수정
(위치: /etc/apache2/mods-enabled/security2.conf)
apache 재시작 했는데 에러 발생...?
/etc/apache2/modsecyrity-crs/coreruleset-3.3.4/rules/REQUEST-922-MULTIPART-ATTACK.conf 에서 에러 발생
(보안상 비추천하는 방법이지만 해당 파일의 이름을 conf 가 아닌 conff 로 변경하여 파일을 읽지 못하도록 설정)
⓸ XSS 공격 시도
URL에 <script> 태그로 사용자의 쿠키 정보 가져오기
Forbidden 출력됨을 확인
< ModSecurity에 의해 차단된 것임을 확인하기 >
- 파일 위치: /var/log/apache2/error.log
- Mached phrase: document.cookie
: 공격자가 사용자의 쿠키 정보를 탈취하기 위해 사용됨
- REQUEST-941-APPLICATION-ATTACK-XSS.conf
: XSS 공격을 방어하는 규칙 포함
- id “941180” (차단된 규칙 ID)
: OWASP CRS 규칙의 일환으로 XSS 공격을 감지하기 위한 블랙리스트 기반의 키워드 검출 기능 제공
→ 해당 규칙에 의해 차단됨
- 파일 위치: /var/log/apache2/modsec_audit.log
- file "/etc/apache2/modsecurity-crs/coreruleset-3.3.4/rules/RESPONSE-980-CORRELATION.conf"
: 적용된 규칙 파일
- id "980130" (이상 탐지 기반으로 설정된 점수를 평가하여 차단을 결정하는 규칙)
: 해당 규칙에 의해 차단
- Total Inbound Score: 23
차단 이유: XSS 공격 점수 20이 감지되었고, inbound_anomaly_score_threshold 임계값을 초과함
URL Rewrite 설정
- Rewrite 모듈 활성화
sudo a2enmod rewrite
- 가상 호스트 파일 수정
(위치: /etc/apache2/sites-available/000-default.conf)
- apache 재시작
sudo systemctl restart apache2
- curl 명령어로 확인
Location 헤더를 확인해 HTTP에서 HTTPS로 리디렉션되었는지 확인할 수 있다.
(HTTP/1.1 301 Moved Permanently
Location: https://(domain 이름)/)
HttpOnly 플래그와 CSP 설정, HTTP 응답 헤더 rewrite 규칙 추가
HttpOnly 플래그
목적: XSS 공격 방지
→ HttpOnly 플래그가 설정된 쿠키는 JavaScript를 통해 접근할 수 없으므로, XSS 공격에 의해 쿠키 탈취되는 것을 방지
→ 세션 하이재킹(세션 탈취) 공격 방지하는 데 효과적
CSP
목적: XSS 및 데이터 인젝션 공격 방지, 프레임 클릭재킹 방지
→ 데이터 인젝션 공격, 악성 스크립트 삽입 등을 방지하여 애클리케이션의 보안을 향상
HTTP 응답 헤더 Rewrite 규칙
목적: 응답 헤더 수정
→ 보안 정책을 강화하고, 애플리케이션의 전반적인 보안을 높인다.
→ 응답 헤더를 적절히 설정하면 보안 취약점을 줄이고 애플리케이션을 공격으로부터 보호할 수 있다.
- 가상 호스트 파일 수정
(위치: /etc/apache2/sites-available/000-default.conf)
<Directory /var/www/html>
Options FollowSymLinks
AllowOverride None
Require all granted
#URL Rewrite 설정
RewriteEngine On
#압축 설정(mod_deflate)
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/json
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip
</IfModule>
#MIME 타입 설정 (mod_mime)
<IfModule mod_mime.c>
AddType application/json .json
</IfModule>
#Content-Security-Policy 설정 (mod_headers)
<IfModule mod_headers.c>
Header set Content-Security-Policy "default-src 'self'; script-src 'self' https://www.google.com https://cdnjs.cloudflare.com https://code.getmdl.io; style-src 'self'; img-src 'self' data: https://*; connect-src 'self' https://update.googleapis.com https://clientservices.googleapis.com; font-src 'self' https://fonts.googleapis.com; frame-ancestors 'none'; report-uri /csp-endpoint/report.php;"
<Files "/csp-endpoint/report.php">
Require all granted
</Files>
</IfModule>
#HttpOnly 쿠키 설정 (mod_headers + mod_rewrite)
<IfModule mod_rewrite.c>
RewriteCond %{HTTP_COOKIE} !HttpOnly
RewriteRule ^ - [CO=COOKIE_NAME:COOKIE_VALUE:%{HTTP_HOST}:path:/;HttpOnly]
</IfModule>
<IfModule mod_headers.c>
Header edit Set-Cookie ^(.*)$ "$1; HttpOnly"
</IfModule>
</Directory>
<Directory /var/www/html/csp-endpoint>
Options None
AllowOverride None
Require all granted
<LimitExcept POST>
Require all denied
</LimitExcept>
</Directory>
- 모듈 활성화 후 apache 재시작
sudo a2enmod mime
sudo a2enmod deflate
sudo a2enmod rewrite
sudo a2enmod header
sudo systemctl restart apache2
불필요한 정보 노출 줄이기
Options -Indexes
디렉토리 목록 표시를 비활성화
→ 디렉터리 브라우징을 방지
< 결과 화면 >login2.php 가 속해있는 디렉토리에 들어갔을 때 파일 목록이 뜨지 않는 것을 볼 수 있다.
ServerTokens Prod
ServerSignature Off
Apache 서버가 응답 헤더에서 최소한의 서버 정보를 제공하도록 설정
→ Prod: 버전 정보나 운영체제 정보는 제공되지 않음
서버가 에러 페이지나 디렉터리 목록 하단에 서버 서명을 표시하지 않도록 설정
→Off: Apache 버전 및 기타 서버 정보가 노출되지 않음
< 결과 화면 >Server의 자세한 정보가 노출되지 않음을 볼 수 있다.
'자료' 카테고리의 다른 글
kubenetes 서비스 노출과 버전 업데이트 (0) | 2024.10.04 |
---|---|
추가 보안 적용 (0) | 2024.09.20 |
시큐어 코딩이 적용된 게시판 만들기 Window (HTTP, PHP, SQL Server) (0) | 2024.09.06 |
<추가자료>시큐어 코딩이 적용되지 않은 회원가입 페이지 Ubuntu (Apache, PHP, MySQL) (0) | 2024.09.05 |
시큐어 코딩이 적용되지 않은 게시판 만들기 Window (HTTP, PHP, SQL Server) (0) | 2024.09.04 |