아파치 보안 설정
Apache HTTPD 보안 설정
Apache HTTPD를 운영할 때 보안 설정을 알아보자. 이 문서는 계속 업데이트 되어야 한다. 될까? nginx로 가는게 맞지 않을까?
서버 및 HTTPD 정보 표시
ServerTokens는 응답 헤더의 Server에 담기는 정보 수준을 설정하는 directive이다.
추천 설정
ServerTokens Prod
설명
Prod로 최소 정보만 출력하는 것을 추천하며 설정별 출력은 다음과 같다1.
ServerTokens Full (or not specified)Server sends (e.g.): Server: Apache/2.4.2 (Unix) PHP/4.2.2 MyMod/1.2ServerTokens Prod[uctOnly]Server sends (e.g.): Server: ApacheServerTokens MajorServer sends (e.g.): Server: Apache/2ServerTokens MinorServer sends (e.g.): Server: Apache/2.4ServerTokens Min[imal]Server sends (e.g.): Server: Apache/2.4.2ServerTokens OSServer sends (e.g.): Server: Apache/2.4.2 (Unix)
SSL
비밀번호 입력
비밀번호 설정은 다음과 같이 한다.
추천설정
#apache configurationSSLPassPhraseDialog exec://usr/libexec/httpd-ssl-pass-dialog
# SSLPassPhraseDialog의 스크립트 파일 : ex) /usr/libexec/httpd-ssl-pass-dialog#!/bin/sh#exec /bin/systemd-ask-password "Enter SSL pass phrase for $1 ($2) : "echo "비밀번호"
설명
인증서 위치 Centos 7 기준으로 /etc/pki/tls/certs/에 인증서 파일을 /etc/pki/tls/private/에 키파일을 넣어두자. SSLPassPhraseDialog 비밀번호 입력 방법을 설정한다. 기본 설정인 /usr/libexec/httpd-ssl-pass-dialog파일을 열어보면 systemd-ask-password4를 통해 사용자에게 비밀번호를 입력받는 것을 알 수 있다. 이 경우 httpd가 껐다 켜질때마다 수동으로 패스워드를 입력해주어야 하므로 echo "비밀번호"로 수정하여 stdout으로 비밀번호를 던져 암호를 던져줄 수 있다. 이렇게 수정하면 시스템이 인증서 비밀번호가 평문으로 남아있게 되므로, 키 파일에서 비밀번호를 제거5하고 사용할 수 있다. SELinux8 /usr/libexec/httpd-ssl-pass-dialog를 보면 httpd_passwd_exec_t6 타입이 부여되어 있고, 인증서는 cert_t7 타입이 부여되어 있는 것을 알 수 있다.
[root@machine libexec]# ls -alZ httpd-ssl-pass-dialog-rwxr-xr-x. root root system_u:object_r:httpd_passwd_exec_t:s0 httpd-ssl-pass-dialog
[root@machine private]# pwd/etc/pki/tls/private[root@machine private]# ls -alZdrwxr-xr-x. root root system_u:object_r:cert_t:s0 .drwxr-xr-x. root root system_u:object_r:cert_t:s0 ..-rw-------. root root system_u:object_r:cert_t:s0 localhost.key
SELinux가 enabled 상태에서 SSLPassPhraseDialog 자동 입력을 위해 스크립트를 작성해도 정상 동작하지 않는 경우가 있다. 암호가 정상 입력이 되었는데도 아래와 같이 Pass phrase incorrect 에러가 나면 인증서와 암호 입력 스크립트의 SELinux 타입을 재확인해보자.
[Thu Jan 14 15:53:15.486578 2021] [ssl:emerg] [pid 17683] AH02204: Init: Pass phrase incorrect for key of test.net:443[Thu Jan 14 15:53:15.486657 2021] [ssl:emerg] [pid 17683] SSL Library Error: error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag[Thu Jan 14 15:53:15.486670 2021] [ssl:emerg] [pid 17683] SSL Library Error: error:0D08303A:asn1 encoding routines:ASN1_TEMPLATE_NOEXP_D2I:nested asn1 error[Thu Jan 14 15:53:15.486678 2021] [ssl:emerg] [pid 17683] SSL Library Error: error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag[Thu Jan 14 15:53:15.486703 2021] [ssl:emerg] [pid 17683] SSL Library Error: error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error (Type=RSA)[Thu Jan 14 15:53:15.486713 2021] [ssl:emerg] [pid 17683] SSL Library Error: error:04093004:rsa routines:OLD_RSA_PRIV_DECODE:RSA lib[Thu Jan 14 15:53:15.486720 2021] [ssl:emerg] [pid 17683] SSL Library Error: error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag[Thu Jan 14 15:53:15.486728 2021] [ssl:emerg] [pid 17683] SSL Library Error: error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error (Type=PKCS8_PRIV_KEY_INFO)
# 비밀번호 입력 스크립트 설정# 다른 위치에 파일을 카피할 경우 selinux 등 권한 설정 문제가 있을 수 있으므로# 해당 설정은 초기 값을 그대로 유지하고 httpd-ssl-pass-dialog를 수정하자SSLPassPhraseDialog exec://usr/libexec/httpd-ssl-pass-dialog
#!/bin/sh#systemd-ask-password를 주석처리하고 echo로 비밀번호를 바로 넘겨주자.#exec /bin/systemd-ask-password "Enter SSL pass phrase for $1 ($2) : "echo "비밀번호"