📄 2025.12.29 (Day 44) - 웹 보안과 Apache 웹 서버 보안 설정
1. 핵심 개념 정리
사용자 인증 메커니즘
| # | 핵심 개념 | 설명 | 실무/보안 관점 |
|---|---|---|---|
| 1 | 패스워드 보안 원칙 | 세 종류 이상 문자 조합(abc123!@), 두 종류 이상 8자 이상(angel12345), 특정 명칭 첫 글자 조합 | 안전한 패스워드 생성 규칙, 추측 어려운 조합 사용, 노래 제목/숫자 조합 활용 |
| 2 | ROT 암호화 | ROT13(영어 13자 이동), ROT47(모든 ASCII 문자 치환) | rot13.com, webutils.pl/ROTencode 사이트 활용, 패스워드 변형 저장 |
| 3 | 패스워드 파일 관리 | 엑셀 파일 암호화 + 시트 숨기기 + USB 메모리 이중 보관 | [파일]-[정보]-[통합 문서 보호]-[암호 설정], 외부 저장장치 백업 |
| 4 | 공인인증서 구조 | ITU-T X.509 표준, PKI 공개키 기반 구조 | 일련번호, 주체, 발행자, 유효기간, 공인키, 지문 알고리즘, 지문 포함 |
| 5 | 공인인증서 저장 | C:\Users\계정\AppData\LocalLow\NPKI\발급기관\USER | signCert.der(DER 암호화 인증서), signPri.key(개인키) |
생체 인증 기술
| # | 핵심 개념 | 설명 | 실무/보안 관점 |
|---|---|---|---|
| 6 | 지문 인증 | 융선과 골 구성, 지문 등록(enrollment) -> 지문 인증(verification) 프로세스 | 가장 대중적, 평생 변하지 않음, 복제 가능성 존재 |
| 7 | 손 모양 인증 | 손가락 길이와 굵기 측정, 낮은 보안 수준 | 정맥 모양 촬영 시 보안 수준 향상 가능 |
| 8 | 망막 인증 | 눈 뒷부분 모세혈관 형태 확인, 10~15초 소요 | 매우 높은 정확도, 안경 착용 시 불가, 불편함 |
| 9 | 홍채 인증 | 홍채 패턴을 수학/통계 알고리즘으로 분석, 50cm 거리 인증 | 망막보다 정확도 높음, 자동 통관 시스템 적용, Apple Face ID |
| 10 | 생체 인증 성능 | FRR(False Rejection Rate, Type I), FAR(False Acceptance Rate, Type II), EER(Error Equal Rate) | FRR: 권한자 거부, FAR: 비권한자 허용(더 치명적), EER: 교차점(낮을수록 우수) |
접근 통제 모델
| # | 핵심 개념 | 설명 | 실무/보안 관점 |
|---|---|---|---|
| 11 | 보안 등급 체계 | Top Secret(최고 기밀) > Secret > Confidential > Restricted > Unclassified | 군사/정부 문서 보안 수준, 극도의 치명적 피해 방지 |
| 12 | DAC (임의적 접근 통제) | Discretionary Access Control, 정보 소유자가 보안 수준 결정 | 유닉스/윈도우 파일 권한(rwx rw- rw-), 중앙 집중 관리 어려움 |
| 13 | Bell-LaPadula 모델 | 기밀성 중심, No read up(상위 정보 읽기 금지), *property(하위 정보 쓰기 금지) | 보안 수준 2 정보를 수준 1에 기록하면 기밀성 손상, 군사/정부 적용 |
| 14 | Biba 모델 | 무결성 중심, Read up(상위 정보 읽기 허용), No write up(상위 정보 쓰기 금지) | Bell-LaPadula와 반대 개념, 금융 거래 데이터 보호 |
| 15 | RBAC | Role-Based Access Control, 직책 기반 권한 부여 | 사람이 아닌 역할에 권한 할당, 직책 이동 시 불필요 권한 확대 방지 |
2. 실습 내용 정리
실습 9-1: 나만의 방식으로 안전하게 패스워드 관리하기
목표: ROT 암호화 및 엑셀 파일 암호화를 활용한 안전한 패스워드 저장 방법 실습
실습 환경:
- ROT13 온라인 도구: rot13.com
- ROT47 온라인 도구: webutils.pl/ROTencode
- Microsoft Excel
실습 단계:
- ROT13 암호화 실습 - rot13.com 접속, Password123!@# 입력 -> Cnffjbeq123!@# 결과 확인
- ROT47 암호화 실습 - webutils.pl/ROTencode 접속, ROT47 옵션 선택 -> Password123!@# 입력
- 엑셀 파일에 패스워드 정보 입력 - 사이트, 설명, 아이디, 인코딩된 패스워드, 가입일, 최종 변경일 컬럼 생성
- 시트 숨기기 - 시트명 우클릭 -> [숨기기(H)] 선택
- 엑셀 파일 암호화 - [파일] -> [정보] -> [통합 문서 보호] -> [암호를 사용하여 암호화] -> 암호 설정
- USB 메모리에 이중 보관 - 외부 저장장치 백업
분석 포인트:
- ROT13은 영어 알파벳만 13자 이동 (A -> N, B -> O)
- ROT18은 문자+숫자 모두 치환
- ROT47은 모든 ASCII 문자(33~126) 치환 가능
- 엑셀 파일 암호 설정 후 외부 저장장치 백업 여부 확인
보안 인사이트:
- ROT 암호화는 기초적이지만 평문 저장보다 안전
- 패스워드 파일 자체 암호화로 2차 보안 레이어 구축
- 시트 숨기기 기능으로 추가 보안 레이어 제공
- USB 이중 보관으로 컴퓨터 손상/해킹 시 복구 가능
실습 9-2: 공인인증서 파일 확인하기
목표: Windows 시스템에서 공인인증서 파일 구조 및 X.509 인증서 정보 확인
실습 단계:
- 공인인증서 폴더 탐색 - C:\Users\사용자계정\AppData\LocalLow\NPKI
- 발급 기관별 폴더 확인 (yessign, SignKorea, CrossCert, NPKI 등)
- USER 폴더 내 파일 확인
- signCert.der - DER 암호화된 인증서 파일
- signPri.key - 개인키 파일
- signCert.der 더블클릭하여 인증서 정보 확인
- [일반] 탭: 발급 대상, 발급자, 유효 기간
- [자세히] 탭: 버전, 일련번호, 서명 알고리즘, 발급자, 유효 기간, 주체, 공개 키
- 인증서 구성요소 확인
- 버전: V3
- 일련번호: 고유 식별자
- 서명 알고리즘: sha256RSA
- 발급자: yessignCA Class 1
- 유효 기간: 2016.04.24 ~ 2017.04.24
X.509 인증서 구조:
- 일련번호 - 증명서 개별 인증
- 주체 - 사람 또는 증명자
- 서명 알고리즘 - 서명 생성 알고리즘
- 발행자 - 정보 검증 및 증명서 발행 주체 (CA)
- 유효 기간 - 시작일/만료일
- 키 이용 목적 - SSL, 전자서명 등
- 공인키 - 공개키
- 지문 알고리즘 - 인증서 해시 알고리즘
- 지문 - 증명서 개봉 여부 증명
보안 고려사항:
탐지 패턴:
- 인증서 유효 기간 만료
- 비인가 인증서 사용 시도
- 인증서 파일 무단 복사/이동
- 취소된 인증서(CRL) 사용 시도
방어 방법:
- 주기적인 인증서 유효 기간 점검
- 인증서 파일 접근 권한 엄격 관리 (signPri.key 특히 중요)
- 인증서 갱신 알림 시스템 구축
- CRL(Certificate Revocation List) 확인 절차
실습 9-3: 아파치 웹 서버 설치하기 (Ubuntu 22.04)
목표: Ubuntu Linux에 Apache2 웹 서버 설치 및 기본 동작 확인
실습 환경:
- Ubuntu 22.04 LTS
- VMware Workstation
- root 권한 필요
실습 단계:
- 패키지 목록 업데이트 -
sudo apt-get install update - 루트 권한 전환 -
sudo su - - DPKG 설정 파일 세팅 -
dpkg --configure -a - Apache2 설치 -
apt-get install apache2 - 아파치 서비스 시작 -
systemctl start apache2 - 프로세스 확인 -
ps -ef | grep apache2- root 권한 parent 프로세스 1개
- www-data 권한 worker 프로세스 여러 개 확인
- 포트 리스닝 확인 -
netstat -tuln | grep :80또는ss -tuln | grep :80 - 브라우저 접속 테스트 - http://localhost 또는 http://서버IP -> “It works!” 페이지 확인
분석 포인트:
- apache2 프로세스가 여러 개 실행 중 (parent + worker processes)
- root 권한으로 parent 실행, www-data 권한으로 worker 실행
- 기본 포트 80번 리스닝 상태
- /var/www/html/index.html 기본 페이지 표시
- 설정 파일 위치: /etc/apache2/ (Ubuntu 특징)
보안 인사이트:
- Apache는 멀티 프로세스 모델 (MPM Prefork)로 동작
- root 권한으로 시작하나 worker는 www-data 계정으로 권한 제한
- 기본 설치 상태는 보안 강화 필요 (디렉터리 리스팅, 버전 정보 노출 등)
- Ubuntu는 설정 파일이 여러 개로 분산 (apache2.conf, sites-available, mods-available 등)
실습 9-4: 아파치 웹 서버 보안 설정하기
목표: 디렉터리 리스팅 차단, FollowSymLinks 비활성화, 로그 분석
실습 단계:
- Apache 메인 설정 파일 확인 -
nano /etc/apache2/apache2.conf - 포트 설정 확인 -
nano /etc/apache2/ports.conf(Listen 80 기본 HTTP) - 가상 호스트 설정 확인 -
nano /etc/apache2/sites-available/000-default.conf(DocumentRoot /var/www/html) - 기본 문서 설정 확인 -
nano /etc/apache2/mods-available/dir.conf(DirectoryIndex 설정) - 디렉터리 리스팅 차단 - apache2.conf에서
<Directory /var/www/>블록의 Options에서 Indexes 제거 - 아파치 재시작 -
systemctl restart apache2 - 디렉터리 리스팅 테스트 -
/var/www/html/test폴더 생성 후 브라우저 접속 -> Forbidden 확인 - FollowSymLinks 테스트 -
ln -s /etc /var/www/html/etc후 접속 -> /etc 내용 노출 확인 - FollowSymLinks 비활성화 -
Options -Indexes -FollowSymLinks설정 후 재시작 - 접근 로그 확인 -
tail -f /var/log/apache2/access.log
디렉터리 리스팅 차단 원리:
Options 지시자:
- Indexes: 디렉터리 내 파일 목록 자동 표시 -> 제거 시 403 Forbidden 반환
- FollowSymLinks: 심볼릭 링크 추적 허용 -> 활성화 시 시스템 디렉터리 접근 가능, 제거 시 차단
- MultiViews: 콘텐츠 협상 기능 -> 필요시에만 활성화
권장 설정: Options -Indexes -FollowSymLinks
발견 가능한 취약점:
- Indexes 설정 시 디렉터리 구조 완전 노출
- FollowSymLinks 허용 시 /etc, /var 등 시스템 디렉터리 접근 가능
- 기본 에러 페이지에 Apache 버전 정보 노출
- 상세한 에러 메시지로 웹 서버 내부 경로 정보 유출
보안 고려사항:
탐지 패턴:
- 403 Forbidden 대량 발생 (무작위 디렉터리 스캔)
- ../../../etc/passwd 경로 순회(Path Traversal) 시도
- access.log에서 robots.txt, .git, .env 등 민감 파일 접근 시도
- 특정 IP에서 짧은 시간 대량 요청 (디렉터리 스캔)
방어 방법:
- Options에서 Indexes, FollowSymLinks 제거
- ServerTokens Prod (버전 정보 숨김)
- ServerSignature Off (에러 페이지 시그니처 제거)
- 심볼릭 링크 사용 금지 또는 제한적 허용
- Fail2ban 설정으로 스캔 시도 IP 자동 차단
실습 9-5: Apache access_log 분석하기
목표: Apache 접근 로그 구조 이해 및 CustomLog/LogFormat 설정 분석
Combined 로그 형식 분석:
로그 구조 예시:
127.0.0.1 - - [29/May/2022:00:41:38 +0300] "GET / HTTP/1.1" 200 3460 "-" "Mozilla/5.0"
각 필드 설명:
%h- 클라이언트 IP 주소%l- 클라이언트 사용자 이름 (identd, 대부분 -)%u- 인증된 사용자 이름 (HTTP 인증)%t- 요청 시간 [날짜:시간 타임존]"%r"- 요청 라인 (메소드 URL 프로토콜)%>s- 최종 상태 코드 (200, 404, 500 등)%O- 응답 크기 (bytes, 헤더 포함)"%{Referer}i"- 리퍼러 (이전 페이지)"%{User-Agent}i"- 브라우저 정보
LogFormat 정의:
- combined:
%h %l %u %t "%r" %>s %O "%{Referer}i" "%{User-Agent}i" - common:
%h %l %u %t "%r" %>s %O - referer:
%{Referer}i -> %U - agent:
%{User-agent}i
로그 인수 상세:
| 인수 | 설명 | 예시 |
|---|---|---|
| %a | 클라이언트 IP | 192.168.1.100 |
| %A | 로컬 서버 IP | 10.0.0.1 |
| %h | 클라이언트 호스트/IP | example.com |
| %l | 클라이언트 identd | - |
| %u | 인증 사용자 | john |
| %t | 요청 시간 | [29/May/2022:00:41:38] |
| %r | 요청 첫 번째 줄 | GET /index.html HTTP/1.1 |
| %>s | 최종 상태 코드 | 200, 404, 500 |
| %O | 응답 크기(헤더 포함) | 3460 |
| %{Referer}i | 리퍼러 URL | https://google.com |
| %{User-Agent}i | UA 문자열 | Mozilla/5.0 |
SetEnvIf 활용:
SetEnvIf 인수:
- 요청 헤더: Host, User-Agent, Referer, Accept-Language
- 요청 특성: Remote_Host, Remote_Addr, Server_Addr, Request_Method, Request_Protocol, Request_URI
SetEnvIf 적용 예시:
- 특정 IP 로그 제외:
SetEnvIf Remote_Addr "127\.0\.0\.1" dontlog+CustomLog logs/access_log common env=!dontlog - 웜 공격 로그 제외:
SetEnvIf Request_URI "\.ida" worm+CustomLog logs/access_log common env=!worm - 이미지 파일 로그 제외:
SetEnvIf Request_URI "\.(gif|jpg|png)$" image+CustomLog logs/access_log common env=!image - 특정 브라우저 식별:
SetEnvIf User-Agent "MSIE" msie_browser또는SetEnvIf User-Agent "Mozilla" mozilla_browser
3. 입력값 검증 비교표
SQL Injection 방어 기법
| 항목 | 취약한 코드 | 안전한 코드 | 차이점 | 사용 시기/적용 방안 |
|---|---|---|---|---|
| 문자열 연결 | String query = "SELECT * FROM " + tableName + " WHERE Name = " + name; |
String query = "SELECT * FROM ? WHERE Name = ?"; |
직접 연결 vs 파라미터 바인딩 | Prepared Statement 사용 |
| 파라미터 설정 | stmt.executeQuery(query); |
stmt.setString(1, tableName); stmt.setString(2, name); |
직접 실행 vs 바인딩 후 실행 | setString(), setInt() 메서드 |
| 쿼리 컴파일 | 런타임 쿼리 생성 | 쿼리 미리 컴파일 | SQL 인젝션 가능 vs 차단 | DB에 컴파일된 쿼리 전달 |
| 공격 차단 | ' OR '1'='1 입력 시 인증 우회 |
파라미터는 문자열로 처리 | 모든 사용자 조회 vs 안전 | 사용자 입력을 코드로 해석 안 함 |
XSS 방어 기법
| 항목 | 취약한 코드 | 안전한 코드 | 차이점 | 사용 시기/적용 방안 |
|---|---|---|---|---|
| 직접 출력 | <p>NAME: <%= name %></p> |
name = name.replaceAll("<", "<"); name = name.replaceAll(">", ">"); |
특수문자 그대로 vs 치환 | 출력 전 replaceAll() 사용 |
| 특수문자 치환 | 없음 | < -> <, > -> >, & -> &, " -> " |
스크립트 실행 vs 문자 표시 | HTML Entity 변환 |
| 검증 위치 | 클라이언트 측만 | 서버 측 필수 (JSP, PHP) | Burp Suite 우회 가능 vs 불가 | 서버 언어에서 구현 |
| 공격 차단 | <script>alert('XSS')</script> 실행 |
<script>... 문자열로 표시 |
악성 스크립트 실행 vs 차단 | 반사형/저장형 XSS 모두 방어 |
파일 업로드 검증
| 항목 | 취약한 코드 | 안전한 코드 | 차이점 | 사용 시기/적용 방안 |
|---|---|---|---|---|
| 확장자 검증 | 확장자 체크 없음 | 화이트리스트 방식 | 모든 파일 허용 vs 특정만 허용 | .hwp, .doc, .pdf만 허용 |
| 파일명 처리 | 원본 파일명 저장 | UUID/랜덤 문자열로 변경 | 추측 가능 vs 불가능 | UUID.randomUUID() 사용 |
| 저장 경로 | 웹 루트 내 저장 | 웹 루트 외부 저장 | 직접 실행 가능 vs 불가 | /var/uploads 별도 경로 |
| 공격 차단 | shell.php 업로드 후 실행 | .php 업로드 차단 | 웹셸 설치 가능 vs 차단 | 실행 권한 제거, MIME 검증 |
필터링 방식 비교
| 예시 | 화이트리스트 | 블랙리스트 | 보안 영향 |
|---|---|---|---|
| 파일 업로드 | .hwp, .doc, .pdf만 허용 | .php, .jsp, .aspx 차단 | 4개만 통과 vs 수백 개 차단 필요 (우회 가능성) |
| SQL 인젝션 | 영문자, 숫자만 허용 | ', --, union 차단 |
명확한 허용 vs 새로운 패턴 우회 가능 |
| XSS | 특정 HTML 태그만 허용 | <script>, onerror 차단 |
안전한 태그만 허용 vs 인코딩 우회 가능 |
| 권장 사항 | 파일 확장자, 입력 형식에 사용 | 알려진 공격 패턴 보완 | 화이트리스트 우선, 블랙리스트 보완 |
4. 심화 분석
접근 통제 모델 상세 비교
| 구분 | DAC | Bell-LaPadula | Biba | RBAC | 분석/인사이트 |
|---|---|---|---|---|---|
| 목적 | 소유자 재량 | 기밀성 보호 | 무결성 보호 | 역할 기반 관리 | 상황에 따른 모델 선택 |
| 읽기 규칙 | 소유자 결정 | No read up | Read up 허용 | 역할별 설정 | B-L: 상위 정보 읽기 금지 |
| 쓰기 규칙 | 소유자 결정 | No write down (*property) | No write up | 역할별 설정 | 기밀성 vs 무결성 우선순위 |
| 적용 사례 | Unix rwx 권한 | 군사/정부 기밀 | 금융 거래 데이터 | 기업 ERP/그룹웨어 | 목적에 따라 혼합 사용 가능 |
| 장단점 | 유연하나 관리 어려움 | 기밀 보호 강력 | 데이터 변조 방지 | 권한 확대 자동 방지 | RBAC이 실무에서 가장 널리 사용 |
Apache 로그 공격 패턴 분석
공격 시나리오 1: SQL Injection 탐지
로그 예시:
192.168.1.100 - - [30/Dec/2024:10:15:32 +0900] "GET /login.php?user=' OR '1'='1 HTTP/1.1" 200 5432 "-" "sqlmap/1.6"
탐지 포인트:
- Request_URI에 SQL 구문 (
' OR '1'='1,UNION SELECT,--) - User-Agent에 공격 도구명 (sqlmap, havij)
- 단시간 대량 요청 (초당 100+)
공격 시나리오 2: Directory Traversal
로그 예시:
192.168.1.200 - - [30/Dec/2024:10:20:15 +0900] "GET /../../../etc/passwd HTTP/1.1" 403 298 "-" "Mozilla/5.0"
탐지 포인트:
- Request_URI에
../패턴 반복 - 403 Forbidden (차단 성공)
- /etc/passwd, /etc/shadow 경로 시도
공격 시나리오 3: 웹셸 업로드
로그 예시:
192.168.1.150 - - [30/Dec/2024:10:25:40 +0900] "POST /upload.php HTTP/1.1" 200 89
탐지 포인트:
- POST /upload.php 요청
- error.log에 “invalid extension”
- .php, .jsp, .aspx 확장자 시도
공격 시나리오 4: Brute Force
로그 예시:
192.168.1.180 - - [30/Dec/2024:10:30:01 +0900] "POST /login.php HTTP/1.1" 401 345 "-" "Python-requests/2.28.1" (동일 IP에서 100+ 반복)
탐지 포인트:
- 동일 IP에서 POST /login.php 대량
- 401 Unauthorized 반복
- User-Agent: Python-requests, curl
생체 인증 FRR/FAR 분석
임계값에 따른 성능 트레이드오프:
- 임계값 높임: FRR 증가, FAR 감소 (보안↑, 불편↑)
- 임계값 낮춤: FRR 감소, FAR 증가 (편의↑, 보안↓)
- EER 지점: FRR == FAR (최적 설정점)
테스트 시나리오:
- threshold 0.85 (일반): FRR/FAR 균형
- threshold 0.90 (엄격): FRR 증가, FAR 감소
- threshold 0.80 (느슨): FRR 감소, FAR 증가
5. 실무/보안 적용
SOC 분석가 관점 - 웹 공격 탐지/대응
| 단계/유형 | 탐지 포인트 | 로그 예시 | 대응 방안 |
|---|---|---|---|
| SQL Injection | Request_URI에 SQL 키워드(union, select, ', --), 비정상 파라미터 값 |
GET /login?id=admin' OR '1'='1 |
WAF 규칙 적용, 해당 IP 차단, 애플리케이션 코드 검토 |
| XSS | <script>, javascript:, onerror, 인코딩 스크립트 (%3Cscript%3E) |
GET /search?q=<script>alert(1)</script> |
CSP 헤더 적용, 입력값 필터링 강화, 저장형 XSS 시 DB 정화 |
| Path Traversal | ../, ..\ 패턴, 403 Forbidden 대량, /etc/passwd 접근 시도 |
GET /../../../etc/passwd |
경로 정규화 검증, chroot 환경, 파일 접근 로그 모니터링 |
| File Upload | .php, .jsp, .aspx 업로드, MIME 타입 불일치, 이중 확장자 (file.php.jpg) | POST /upload.php (shell.php) |
화이트리스트 검증, 파일 실행 권한 제거, 업로드 디렉터리 격리 |
| Brute Force | 단시간 로그인 실패 반복, 401/403 대량 발생, 자동화 도구 UA | POST /login (401) x 100회 |
계정 잠금 정책, CAPTCHA 적용, IP 속도 제한 |
| DDoS/Scanning | 초당 100+ 요청, robots.txt 접근, Nikto/Nmap UA | GET /admin (404) x 1000회 |
Rate Limiting, Fail2ban 설정, CDN/WAF 활용 |
Apache 보안 설정 핵심 항목
서버 정보 숨기기:
ServerTokens Prod- 버전 정보 최소화ServerSignature Off- 에러 페이지 시그니처 제거
디렉터리 보안:
Options -Indexes -FollowSymLinks- 디렉터리 리스팅 및 심볼릭 링크 차단- FilesMatch로 .htaccess, .htpasswd, .log, .sql 파일 접근 차단
HTTP 메서드 제한:
- GET, POST, HEAD만 허용
- TRACE, PUT, DELETE 차단
타임아웃 및 요청 크기 제한:
- Timeout 60
- KeepAliveTimeout 5
- LimitRequestBody 10MB
SetEnvIf 로그 필터링:
- 내부 IP(10.0.0.0/8) env=internal 설정 ->
CustomLog combined env=!internal - 정적 파일(.gif, .jpg, .png, .css, .js) env=static 설정 ->
CustomLog combined env=!static
보안 헤더 (mod_headers):
- X-Frame-Options: SAMEORIGIN
- X-Content-Type-Options: nosniff
- X-XSS-Protection: 1; mode=block
- Referrer-Policy: strict-origin-when-cross-origin
SSL/TLS 설정:
- SSLv2, SSLv3, TLSv1, TLSv1.1 비활성화
- TLS 1.2 이상만 허용
- HIGH:!aNULL:!MD5 Cipher Suite
ModSecurity (WAF):
- SecRuleEngine On
- OWASP CRS(Core Rule Set) 포함
- 오탐 시 SecRuleRemoveById로 특정 룰 비활성화 가능
6. 배운 점 및 인사이트
새로 알게 된 점
-
ROT 암호화 실무 활용: ROT13/ROT47 같은 단순 치환 암호도 평문 저장보다 훨씬 안전. 특히 ROT47은 모든 ASCII 문자(33~126)를 치환하여 특수문자 포함 복잡한 패스워드도 변형 가능. 엑셀 파일 암호화와 결합하면 실용적인 개인 패스워드 관리 방안
-
생체 인증 성능 지표: FRR과 FAR의 트레이드오프 관계가 명확함. 임계값을 높이면 FRR 증가(사용자 불편), 낮추면 FAR 증가(보안 위험). EER 지점이 이론적 최적 설정이나, 실무에서는 보안 수준에 따라 FAR을 0.01% 이하로 낮추는 방향으로 조정
-
Apache 로그 필터링 기법: SetEnvIf로 내부 IP나 정적 파일 요청을
env=!dontlog방식으로 로그에서 제외하여 로그 파일 크기를 50% 이상 절감 가능. SIEM 연동 전 1차 필터링으로 분석 효율 향상 -
접근 통제 모델의 실제 적용: Bell-LaPadula(기밀성)는 군사/정부, Biba(무결성)는 금융, RBAC은 기업 ERP/그룹웨어에 주로 사용. 현대 클라우드 환경에서는 RBAC + ABAC(Attribute-Based) 하이브리드 모델이 트렌드
-
서버 측 입력값 검증의 중요성: 클라이언트 측 JavaScript 검증은 Burp Suite로 쉽게 우회 가능. JSP, PHP 등 서버 언어에서 Prepared Statement, replaceAll(), 화이트리스트 검증을 필수로 구현해야 SQL Injection/XSS 방어 가능
이전 학습과의 연결고리
-
개인정보보호법과 연계: 개인정보보호법 시행령의 “접근 기록 최소 6개월 보관” 의무는 Apache access.log가 바로 충족하는 수단. 로그에는 IP 주소(개인정보)가 포함되므로 로그 파일 자체도 암호화 저장 권장. SetEnvIf로 필요한 로그만 수집하면 개인정보 최소 수집 원칙 준수
-
웹 해킹 실습 확장: WebGoat에서 실습한 SQL Injection, XSS 공격이 실제 Apache 로그에
union select,<script>패턴으로 기록됨을 확인. 공격자 관점에서 공격 기법 학습 -> SOC 분석가 관점에서 로그 탐지 패턴 이해 -
네트워크 보안과 연계: Apache 로그의 클라이언트 IP 분석은 방화벽, IDS/IPS 로그와 상관분석 필수. 동일 IP에서 SQL Injection 시도 -> 방화벽 차단 -> IDS 알람 -> Apache 403 로그를 종합하여 공격 전체 타임라인 재구성
실무 적용 아이디어
SOC 분석가 관점:
- Apache 로그 실시간 분석 자동화: Python 스크립트로 실시간 로그 읽기. SQL Injection(
union,select,--), XSS(<script>,javascript:), Path Traversal(../) 패턴을 정규표현식으로 탐지. 임계값 초과 시 Slack/Email 알림. SIEM 연동 전 1차 필터링 도구로 활용 - SetEnvIf 기반 로그 최적화: 내부 네트워크 대역(10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16)을 SetEnvIf로 “internal” 환경변수 설정 ->
CustomLog env=!internal로 외부 IP만 수집. 로그 볼륨 50% 절감 - 생체 인증 FAR/FRR 모니터링: 출입통제 시스템의 인증 성공/실패 로그를 일별로 수집하여 FRR/FAR 지표 계산. FAR이 임계값(0.01%) 초과 시 인증 시스템 오작동이나 위변조 공격 가능성 의심
보안 아키텍처 설계 - 3-Tier 웹 보안:
- Tier 1 (Web): Apache + ModSecurity (WAF)로 SQL Injection/XSS 1차 차단
- Tier 2 (App): Prepared Statement + 입력값 검증 (replaceAll, 화이트리스트)로 2차 방어
- Tier 3 (DB): 최소 권한 DB 계정 + 저장 프로시저로 3차 방어
- 각 계층마다 로그를 SIEM으로 중앙 수집 -> 공격 경로 전체 추적 가능
7. Quick Reference
Apache 명령어 모음
서비스 관리:
systemctl start apache2- 시작systemctl stop apache2- 중지systemctl restart apache2- 재시작systemctl reload apache2- 설정 다시 로드 (연결 유지)systemctl status apache2- 상태 확인systemctl enable apache2- 부팅 시 자동 시작
설정 검증:
apache2ctl configtest- 설정 파일 문법 검사apache2ctl -M- 로드된 모듈 목록apache2ctl -S- VirtualHost 설정 요약apache2 -v- Apache 버전
로그 관리:
tail -f /var/log/apache2/access.log- 접근 로그 실시간tail -f /var/log/apache2/error.log- 에러 로그 실시간grep "404" /var/log/apache2/access.log- 404 에러 검색grep "192.168.1.100" /var/log/apache2/access.log- 특정 IP 검색
모듈 관리:
a2enmod ssl- SSL 모듈 활성화a2dismod autoindex- 디렉터리 인덱싱 비활성화a2enmod headers- 헤더 모듈 활성화a2enmod rewrite- URL 재작성 모듈 활성화
로그 분석 명령어:
- 가장 많이 접속한 IP 상위 10개:
awk '{print $1}' /var/log/apache2/access.log | sort | uniq -c | sort -rn | head -10 - 가장 많이 요청된 URL 상위 10개:
awk '{print $7}' /var/log/apache2/access.log | sort | uniq -c | sort -rn | head -10 - SQL Injection 시도 패턴:
grep -E "(union|select|'|--)" /var/log/apache2/access.log - XSS 시도 패턴:
grep -E "(<script|javascript:|onerror)" /var/log/apache2/access.log
보안 개념 핵심 요약표
| 구분 | 항목 | 핵심 키워드 | 주요 내용 | 적용 방법 |
|---|---|---|---|---|
| 인증 | 패스워드 | ROT13/47, 암호화 | 세 종류 이상 문자 조합, 변형 저장 | rot13.com, 엑셀 암호화 |
| 인증 | 공인인증서 | PKI, X.509 | 공개키 기반, 전자 신분증 | signCert.der, signPri.key |
| 인증 | 생체 인증 | FRR, FAR, EER | 지문/홍채/얼굴, 성능 지표 | FAR < 0.01%, EER 최소화 |
| 접근통제 | DAC | 임의적, rwx | 소유자가 권한 결정 | chmod 755, chown |
| 접근통제 | Bell-LaPadula | 기밀성, No read up | 상위 정보 읽기 금지 | 군사/정부 기밀 |
| 접근통제 | Biba | 무결성, No write up | 상위 정보 쓰기 금지 | 금융 거래 데이터 |
| 접근통제 | RBAC | 역할 기반 | 직책에 권한 할당 | 기업 ERP/그룹웨어 |
| 입력검증 | SQL Injection | Prepared Statement | 파라미터 바인딩 | setString(), setInt() |
| 입력검증 | XSS | HTML Entity | < -> <, > -> > |
replaceAll() 메서드 |
| 입력검증 | File Upload | 화이트리스트 | 허용 확장자만 업로드 | .hwp, .doc, .pdf만 허용 |
| 웹서버 | Options | Indexes, FollowSymLinks | 디렉터리 리스팅 차단 | Options -Indexes |
| 웹서버 | ServerTokens | Prod | 서버 버전 정보 숨김 | ServerTokens Prod |
| 웹서버 | CustomLog | combined, common | 접근 로그 형식 | %h %l %u %t “%r” %>s %O |
| 웹서버 | SetEnvIf | dontlog, internal | 로그 필터링 | env=!dontlog |
| 웹서버 | ModSecurity | WAF, CRS | 웹 방화벽 | SecRuleEngine On |
웹 보안 점검 체크리스트
사용자 인증:
- 패스워드 정책 수립 (8자 이상, 3종 조합)
- 패스워드 변형 저장 (ROT 암호화 등)
- 공인인증서 유효기간 점검 (만료 전 갱신)
- 2FA/MFA 적용 여부 확인
- 생체 인증 FAR < 0.01% 유지
접근 통제:
- 역할 기반 권한 관리(RBAC) 적용
- 최소 권한 원칙 준수
- 관리자 계정 활동 감사 로그
- 주기적 권한 검토 (분기별)
- 직무 분리 및 직무 교대
입력값 검증:
- Prepared Statement 사용 (SQL Injection 방어)
- HTML Entity 치환 (XSS 방어)
- 파일 업로드 화이트리스트 검증
- 서버 측 필터링 필수 적용
- CSRF 토큰 검증
Apache 웹 서버:
- Options -Indexes -FollowSymLinks 설정
- ServerTokens Prod, ServerSignature Off
- 민감 파일 접근 차단 (.htaccess, .git, .env)
- SSL/TLS 1.2 이상만 허용
- 보안 헤더 적용 (X-Frame-Options, CSP)
- ModSecurity (WAF) 설치 및 활성화
- 로그 파일 권한 640 이하
- 로그 6개월 이상 보관
- Fail2ban 설정 (Brute Force 방어)
8. 트러블슈팅
| 문제 | 원인 | 해결 방법 |
|---|---|---|
| Apache 시작 실패 | 포트 80 이미 사용 중 | `netstat -tuln |
| Forbidden (403) 지속 | 디렉터리 권한 부족 | chmod 755 /var/www/html, chown www-data:www-data /var/www/html, apache2.conf에서 Require all granted 확인 |
| 디렉터리 리스팅 차단 안 됨 | Indexes 옵션 여전히 존재 | apache2.conf의 모든 Directory 블록 확인, Options -Indexes 설정 (하이픈 필수), systemctl restart apache2 |
| ModSecurity 오탐 | 정상 요청을 공격으로 판단 | /var/log/apache2/modsec_audit.log 확인, 특정 룰 ID 비활성화: SecRuleRemoveById 950901, 화이트리스트 추가 |
| 로그 파일 급격히 증가 | 정적 파일, 내부 IP 로그 과다 | SetEnvIf 활용하여 정적 파일 및 내부 IP 제외, logrotate 설정: /etc/logrotate.d/apache2 |
| SSL 인증서 오류 | 인증서 만료 또는 경로 오류 | openssl x509 -in cert.pem -text -noout 유효기간 확인, SSLCertificateFile/SSLCertificateKeyFile 경로 확인, Let’s Encrypt: certbot renew |
| SetEnvIf 동작 안 함 | 정규표현식 오류 | 역슬래시 이스케이프: "127\.0\.0\.1", 대소문자 구분 주의, `apache2ctl -M |
| access.log에 IP 대신 - | 역방향 DNS 조회 실패 | HostnameLookups Off 설정 (성능 향상), 또는 HostnameLookups On + DNS 서버 확인 |
Today’s Insight:
웹 보안의 핵심은 3단계 방어 체계다. 1단계 인증(Authentication)은 패스워드부터 생체 인증까지 진화하며, 생체 인증의 FAR과 FRR 균형이 중요하다. 2단계 접근 통제(Access Control)는 DAC의 유연성, Bell-LaPadula의 기밀성, Biba의 무결성, RBAC의 실용성을 상황에 맞게 적용한다. 3단계 입력값 검증(Input Validation)은 서버 측 필터링과 화이트리스트 방식이 필수다.
Apache 웹 서버 실습을 통해 이론이 실무로 연결되는 과정을 체감했다. Options -Indexes 하나로 디렉터리 리스팅을 차단하고, SetEnvIf로 로그를 필터링하며, CustomLog로 SOC 분석에 필요한 정보만 수집하는 기법은 즉시 적용 가능하다. 로그 분석 시 union select, <script>, ../ 같은 패턴을 정규표현식으로 탐지하는 것은 SOC 분석가의 기본기이며, 이를 Python으로 자동화하면 침해사고 대응 속도를 크게 높일 수 있다.
앞으로는 ModSecurity(WAF) 룰셋 커스터마이징, SIEM과 Apache 로그 연동, Burp Suite를 활용한 웹 애플리케이션 취약점 진단으로 학습이 이어져야 한다. 웹 보안은 “방어자가 모든 문을 잠가야 하지만, 공격자는 하나의 문만 열면 된다"는 비대칭 게임이므로, 다층 방어(Defense in Depth) 전략이 필수다.