해당 포스팅은 자습서 : Amazon Linux 2에서 SSL / TLS 구성의 내용을 기반으로 작성하였다.
Amazon Linux 2 AMI 서버를 구축하고,
( 참고 : [AWS] EC2 - Amazon Linux 2 AMI 서버 구축 )
Apache 웹 서버 세팅을 완료했다는 것을 전제하에 진행되는
Amazon Linux 2의 EC2 인스턴스 서버에 SSL / TLS 지원을 수동으로 추가하는 방법을 설명한다.
• SSL( Secure Sockets Layer ) / TLS( Transport Layer Security )는
웹 서버와 웹 클라이언트 간 암호화된 채널을 만들어 전송중인 데이터를 보호한다.
• SSL / TLS의 기본 포트는 443( HTTPS : HTTP Secure )을 사용한다.
인증서 제공 https://letsencrypt.org/ko/
#1. EC2 인스턴스의 TCP 포트 보안 그룹 허용
작업을 위해 EC2 보안그룹에서 EC2 인스턴스가 다음 SSH( 22 ), HTTP( 80 ), HTTPS( 443 ) TCP 포트의 연결을 허용하도록 설정 되어 있는지를 확인한다.
EC2 쉘에서 $ netstat -tnlp 명령으로 TCP 포트의 허용 유무를 확인해 보자.
$ netstat -tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN -
tcp6 0 0 :::443 :::* LISTEN -
tcp6 0 0 :::111 :::* LISTEN -
tcp6 0 0 :::80 :::* LISTEN -
tcp6 0 0 :::22 :::* LISTEN -
위와같이 접속이 가능한 것을 확인 할 수 있다.
#2. 서버에서 TLS( Transport Layer Security ) 활성화 하기
01) Apache Web Server 설치 여부 확인
$ sudo systemctl is-enabled httpd
enabled
반환된 값이 “enabled”가 아닌 경우 아래 명령을 실행하여 Apache를 설치한다.
$ sudo yum install httpd -y
Apache Web Server의 설치가 완료되었다면 시스템 부팅 시마다 다시 시작하도록 설정한다.
$ sudo systemctl start httpd && sudo systemctl enable httpd
02) 리눅스 소프트웨어 업데이트
$ sudo yum update -y
모든 소프트웨어 패키지를 최신 상태로 업데이트 해둔다.
03) Apache module 설치
$ sudo yum install -y mod_ssl
ssl.conf
$ ls -al /etc/httpd/conf.d/ssl.conf
-rw-r--r-- 1 root root 9840 Nov 27 09:04 /etc/httpd/conf.d/ssl.conf
make-dummy-cert
$ ls -al /etc/pki/tls/certs/make-dummy-cert
-rwxr-xr-x 1 root root 610 Oct 28 21:07 /etc/pki/tls/certs/make-dummy-cert
이 인증서는 Apache 서버가 TLS를 사용하도록 올바르게 설치되었는지 테스트하는 데 유용하다.
04) 인증서와 키를 생성( 자체 서명된 테스트용 더미 인증서와 키 )
자체 서명된 테스트용 더미 인증서를 생성한다.
$ sudo /etc/pki/tls/certs/make-dummy-cert /etc/pki/tls/certs/localhost.crt
$ ls -al /etc/pki/tls/certs/localhost.crt
-rw------- 1 root root 3254 Nov 26 08:06 localhost.crt
지정된 파일의 이름은 SSLCertificateFile의 /etc/httpd/conf.d/ssl.conf 명령에 할당된 기본값과 일치한다.
이 파일에는 자체 서명된 인증서와 인증서의 프라이빗 키가 모두 포함된다.
Apache에서는 인증서와 키를 PEM 형식으로 요구하는데,
이 형식은 아래의 축약된 예제와 같이 "BEGIN" 및 "END" 라인으로 프레임 처리된 Base64 인코딩 ASCII 문자로 구성된다.
$ sudo cat /etc/pki/tls/certs/localhost.crt
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQD2KKx/8Zk94m1q
3gQMZF9ZN66Ls19+3tHAgQ5Fpo9KJDhzLjOOCI8u1PTcGmAah5kEitCEc0wzmNeo
BCl0wYR6G0rGaKtK9Dn7CuIjvubtUysVyQoMVPQ97ldeakHWeRMiEJFXg6kZZ0vr
GvwnKoMh3DlK44D9dX7IDua2PlYx5+eroA+1Lqf32ZSaAO0bBIMIYTHigwbHMZoT
...
56tE7THvH7vOEf4/iUOsIrEzaMaJ0mqkmY1A70qQGQKBgBF3H1qNRNHuyMcPODFs
27hDzPDinrquSEvoZIggkDMlh2irTiipJ/GhkvTpoQlv0fK/VXw8vSgeaBuhwJvS
LXU9HvYq0U6O4FgD3nAyB9hI0BE13r1HjUvbjT7moH+RhnNz6eqqdscCS09VtRAo
4QQvAqOa8UheYeoXLdWcHaLP
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIEazCCA1OgAwIBAgICWxQwDQYJKoZIhvcNAQELBQAwgbExCzAJBgNVBAYTAi0t
MRIwEAYDVQQIDAlTb21lU3RhdGUxETAPBgNVBAcMCFNvbWVDaXR5MRkwFwYDVQQK
DBBTb21lT3JnYW5pemF0aW9uMR8wHQYDVQQLDBZTb21lT3JnYW5pemF0aW9uYWxV
bml0MRkwFwYDVQQDDBBpcC0xNzItMzEtMjAtMjM2MSQwIgYJKoZIhvcNAQkBFhVy
...
z5rRUE/XzxRLBZOoWZpNWTXJkQ3uFYH6s/sBwtHpKKZMzOvDedREjNKAvk4ws6F0
CuIjvubtUysVyQoMVPQ97ldeakHWeRMiEJFXg6kZZ0vrGvwnKoMh3DlK44D9dlU3
WanXWehT6FiSZvB4sTEXXJN2jdw8g+sHGnZ8zCOsclknYhHrCVD2vnBlZJKSZvak
3ZazhBxtQSukFMOnWPP2a0DMMFGYUHOd0BQE8sBJxg==
-----END CERTIFICATE-----
※ 참고
생성된 파일이름과 확장자명은 편의상 사용되며 기능에 영향을 미치지 않는다.
예를 들어 cert.crt 파일에서 관련 명령에 동일한 이름을 사용하는 한,
인증서 이름을 cert.epem ssl.conf 또는 다른 파일 이름으로 지정할 수 있다.
05) Apache Web Server - SSL 설정 변경
자체 서명된 더미 인증서에도 키가 포함되어 있으므로 /etc/httpd/conf.d/ssl.conf 파일을 열고 다음 행을 주석처리한다.
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key 를 찾고 #주석처리 한다.
$ sudo vim /etc/httpd/conf.d/ssl.conf
~~ 이 하 생 략 ~~
# Server Private Key:
# Server Private Key:
# If the key is not combined with the certificate, use this
# directive to point at the key file. Keep in mind that if
# you've both a RSA and a DSA private key you can configure
# both in parallel (to also allow the use of DSA ciphers, etc.)
# SSLCertificateKeyFile /etc/pki/tls/private/localhost.key // #주석처리
~~ 이 하 생 략 ~~
만일 SSLCertificateKeyFile /etc/pki/tls/private/localhost.key 행을 #주석처리하지 않는 경우
Apache 웹 서버가 재시작되지 않는다.
05) Apache Web Server 재시작
$ sudo systemctl restart httpd
정상적으로 Apache 웹 서버가 재시작 되면 Browser를 열고 주소 표시줄에
예) https://www.도메인주소.com을 입력하여 테스트해보자.
신뢰할 수 없는 자체 서명된 호스트 인증서를 사용하여 사이트에 연결하기 때문에 브라우저에 보안 경고가 연속으로 표시되는데, 경고를 무시하고 계속 진행하면 된다.
위 이미지와 같이 Apache 기본 테스트 페이지가 열리면 서버에 TLS가 구성되었다는 것입니다. 브라우저와 서버 사이를 통과하는 모든 데이터가 이제 암호화된다.
※ CA 서명 호스트 인증서 획득 지침은 등록과 호스팅이 완료된 DNS 도메인을 소유하지 않을 경우 적용하기 어렵다.
( 가지고 있는 도메인이 없다면 AWS Route 53을 통해 도메인을 구입하고 진행해야 한다. )
#3. CA 인증기관이 서명한 인증서 가져오기
CA( certificate authority ) 인증기관이란?
CA 인증기관이란 보안 적격 여부와 그리고 메시지의 암호화 복원을 위한 공개키들을 발급하는 네트워크 기관이다.
공개키 기반 구조의 빌부로서, 인증기관은 디지털 인증서 요구자에 의해 제공되는 정보를 검증하기 위한 등록기관( RIA )과 함께 안전성 등을 검사한다.
( 공개키 기반구조에 따라 조금씩 다르지만, 인증서는 대개 소유자의 공개키, 인증서의 유효기간, 소유자의 이름 및 기타 공개키 소유자에 관한 다른 정보를 포함한다. )
CA 인증기관은 신청자에게 인증서를 발급하기 전에 도메인의 소유권을 최소한으로 검사합니다.
( 각 웹 브라우저에는 이를 하도록 브라우저 공급업체에서 신뢰한 CA 목록이 포함되어 있다. )
브라우저가 HTTPS를 통해 웹 서버에 연결되면 서버는 브라우저에서 신뢰할 수 있는 CA 목록을 확인하도록 인증서를 제공하고, 서명자가 목록에 있거나 신뢰할 수 있는 다른 서명자로 구성되는 신뢰 체인을 통해 서명자에 액세스할 수 있는 경우, 브라우저는 서버와 암호화된 빠른 데이터 채널을 협상하고 페이지를 로드한다.
요청 확인 절차로 인해 인증서에는 일반적으로 비용이 발생하므로 여러 인증 기관을 알아봐야 합니다.
( AWS EC2 인스턴스를 사용해서 상업용 서비스를 제공할 계획이라면 AWS Certificate Manager가 좋은 옵션이다. )
호스트 인증서의 기본을 이루는 것은 키( KEY )이다.
2019년 정부 및 산업 그룹에서는 2030년까지 문서를 보호하기 위해 마련된 RSA 키에 대해 최소 2048비트의 키(모듈러스) 크기를 사용할 것을 권장한다.
Amazon Linux 2의 OpenSSL에서 생성된 기본 모듈러스 크기는 2048비트이므로 CA가 서명한 인증서에 사용할 수 있다.
해당 포스팅은 테스트 용도로만 사용할 수 있는 자체 서명된 인증서를 생성하여 진행된다.
01) 프라이빗 키( Private Key ) 생성하기
새 프라이빗 키를 생성한다.
/etc/pki/tls/private/ 경로는 TLS에 대한 서버의 프라이빗 키를 저장하는 디렉토리인데
해당 경로에 결과파일인 custom.key 를 생성한다.
$ sudo openssl genrsa -out /etc/pki/tls/private/custom.key
$ ls -al /etc/pki/tls/private/custom.key
-rw-r--r-- 1 root root 1679 Nov 26 10:46 custom.key
아래는 몇가지 키 구성 샘플이다 어떤 결과 키도 웹 서버에서 사용할 수 있지만 보안 구현의 정도와 유형은 각각 다르다.
$ sudo openssl genrsa -out /etc/pki/tls/private/custom.key
$ sudo openssl genrsa -out /etc/pki/tls/private/custom.key 4096
예3: 암호로 보호되는 4096비트 암호화 RSA키( AES-128 암호화 )
$ sudo openssl genrsa -aes128 -passout pass:abcde12345 -out custom.key 4096
$ sudo openssl ecparam -name prime256v1 -out custom.key -genkey
02) 프라이빗 키( Private Key ) 권한 부여
$ sudo chown root:root /etc/pki/tls/private/custom.key
$ sudo chmod 600 /etc/pki/tls/private/custom.key
$ ls -al /etc/pki/tls/private/custom.key
-rw------- 1 root root 1679 Nov 26 10:46 /etc/pki/tls/private/custom.key
03) 프라이빗 키( Private Key )를 사용하여 CSR 생성하기
생상한 프라이빗 키를사용하여 CSR을 생성한다.
$ sudo openssl req -new -key /etc/pki/tls/private/custom.key -out /etc/pki/tls/private/csr.pem
You are about to be asked to enter information that will be incorporated into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX] : KR
State or Province Name (full name) [] : 지역( 시 / 도 )
Locality Name (eg, city) [Default City] : 시 / 군 / 구
Organization Name (eg, company) [Default Company Ltd] : 회사명
Organizational Unit Name (eg, section) [] : 회사내 조직명
Common Name (eg, your name or your server's hostname) [] : 도메인주소
Email Address [] : 이메일주소
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
요구사항 | 설명 | 입력여부 | 입력값( 예시 ) |
Country Name | 해당 국가의 두 자리 ISO 약자 ( 국가코드 ) |
생략 가능 | KR ( = 대한민국 ) |
State or Province Name |
지역 이름을 입력
( 약어를 사용할 수 없다. )
|
생략 가능 | 지역명 |
Locality Name | 위치한 지역의 시 / 군 / 구 | 생략 가능 | 시 / 군 / 구 |
Organization Name | 회사명( 약칭사용 금지 ) | 생략 가능 | Company ( = 회사명 ) |
Organizational Unit Name |
회사 조직에 대한 추가정보
부서명 등을 입력
|
생략 가능 | Developer Time ( = 부서명 ) |
Common Name |
서비스 도메인명
|
필수 입력 | 도메인 주소 |
Email Address | 서버 관리자의 이메일 주소 | 생략 가능 | 이메일 주소 |
A challenge password |
-
|
생략 가능 | 생략 |
An optional company name | - | 생략 가능 | 생략 |
$ ls -al /etc/pki/tls/private/csr.pem
-rw-r--r-- 1 root root 1045 Nov 26 11:09 /etc/pki/tls/private/csr.pem
결과 파일인 csr.pem에는 퍼블릭 키, 퍼블릭 키의 디지털 서명 및 입력한 메타데이터가 포함되어 있다.
04) 인증기관에 CSR 제출
프로덕션용으로 CSR을 CA인증기관에 제출하여 서버 인증서를 받으려면 다른 자격증명이나 ID증명이 필요할 수 있다.
신청이 성공하면 CA에서 디지털 서명된 자격 증명 인증서와 가능한 경우 체인 인증서 파일을 보내 준다.
AWS Certificate Manager 사설 인증 기관
$ sudo openssl x509 -req -days 365 -in /etc/pki/tls/private/csr.pem -signkey /etc/pki/tls/private/custom.key -out /etc/pki/tls/private/custom.crt
Signature ok
subject=/C=국가코드(KR)/ST=지역/L=(시/군/구)/O=회사명/CN=도메인주소/emailAddress=이메일주소
Getting Private key
코드가 정상적으로 생성 되었는지를 확인해 보자.
$ cat /etc/pki/tls/private/custom.crt
-----BEGIN CERTIFICATE-----
MIIDijCCAnICCQCoipiUsmShqjANBgkqhkiG9w0BAQsFADCBhjELMAkGA1UEBhMC
S1IxDjAMBgNVBAgMBVNlb3VsMRUwEwYDVQQHDAxEZWZhdWx0IENpdHkxETAPBgNV
BAoMCHNhYWttaXNvMRkwFwYDVQQDDBB3d3cuc2Fha21pc28uY29tMSIwIAYJKoZI
hvcNAQkBFhN3aWNrZWRAc2Fha21pc28uY29tMB4XDTIxMTEyNjExNTM0OFoXDTIy
MTEyNjExNTM0OFowgYYxCzAJBgNVBAYTAktSMQ4wDAYDVQQIDAVTZW91bDEVMBMG
A1UEBwwMRGVmYXVsdCBDaXR5MREwDwYDVQQKDAhzYWFrbWlzbzEZMBcGA1UEAwwQ
d3d3LnNhYWttaXNvLmNvbTEiMCAGCSqGSIb3DQEJARYTd2lja2VkQHNhYWttaXNv
LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALuG4sRDxA8p0ph/
TTELyQsqHFpmg/Y7/IFJz4EIxVlZRBU8uXNBOM9QapBzwswLg4X1f2tkWziUzhni
lHXdEm+wsv2kyWH5A4WiwTMjqzHWQJCeB/21tuTAZqWl6MLlZsRxxPDQadYpD39B
b2LE43MHAeHaINGGo6crgoWjlRFdgOwU5wmPz9A7lCnRIjeE7/bC8nv8raWytU6N
kK7aUubE4vPyw5VlMNTtWAVo4C1l+KKENBAUeY2BfY9tEJBMeBe2FBhLdl2SoSwY
0coPo/ulYzq2lTvic4vF072VoaGleDIPh+Mc42cY3cdWUbwMDIU+tsHvqR65OzWc
tjPhiYcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAscO/e6NLfqRgfl4L2eddnXCN
hMvCaFLcaxu1/Ldz5+KaMyAujOrf7poePbVU0AaYVluNGsENtXC6oRWZvIqtVfqt
5hhCWUKIMKsX4jftLSCGcbsi64YNNPKPjRBEHDCDXjtefUm6ugbxtodVOSSB7Fov
CqYufghaBja9qSmgTJ4e2r5tuKiqOPvhy8aycmrpEHh8JEijxkLzlibylLfSGcVU
DmxOmaovr0CO5t08cp+NIGfpp24V4wCNciyN4ph/lYaGreWJ7lRWAWAmU1kO9e2c
xmjhbXZlewnT4BIJEqDdCDzwmSDoX/LSvBzg/aENfOqAukObCChg2vWfYbJwMQ==
-----END CERTIFICATE-----
참고
CA는 다양한 목적을 위해 마련된 여러 형식의 파일을 보낼 수 있다. 해당 포스팅은 PEM 형식의 인증서 파일만 사용해야 하는데, 이는 보통 .pem 또는 .crt 파일 확장명으로 표시되지만 항상 그런 것은 아다. 어떤 파일을 사용할지 확실하지 않은 경우 텍스트 편집기로 파일을 열고 다음 라인으로 시작되는 블록 하나 이상이 포함되는 파일을 찾는다.
05) /etc/pki/tls/certs/ 디렉터리에 CA가 서명한 새 인증서와 모든 중간 인증서를 배치
$ sudo cp /etc/pki/tls/private/custom.crt /etc/pki/tls/certs/custom.crt
$ sudo chown root:root /etc/pki/tls/certs/custom.crt
$ sudo chmod 600 /etc/pki/tls/certs/custom.crt
$ ls -al /etc/pki/tls/certs/custom.crt
-rw------- 1 root root 1289 Nov 26 12:04 /etc/pki/tls/certs/custom.crt
( 소유자 = root, 그룹 = root, 소유자 전용 읽기 / 쓰기 )
06) /etc/pki/tls/private/ 디렉터리에서 CSR을 생성할 때 사용한 프라이빗 키 권한 변경
$ sudo chown root:root /etc/pki/tls/private/custom.key
$ sudo chmod 600 /etc/pki/tls/private/custom.key
$ ls -al /etc/pki/tls/private/custom.key
-rw------- 1 root root 1675 Nov 26 10:52 /etc/pki/tls/private/custom.key
( 소유자 = root, 그룹 = root, 소유자 전용 읽기 / 쓰기 )
07) Apache Web Server - SSL 설정 변경
① SSLCertificateFile 명령 수정
$ sudo vim /etc/httpd/conf.d/ssl.conf
~~ 이 하 생 략 ~~
# Server Certificate:
# Point SSLCertificateFile at a PEM encoded certificate. If
# the certificate is encrypted, then you will be prompted for a
# pass phrase. Note that a kill -HUP will prompt again. A new
# certificate can be generated using the genkey(1) command.
# SSLCertificateFile /etc/pki/tls/certs/localhost.crt // #주석처리
SSLCertificateFile /etc/pki/tls/certs/custom.crt
~~ 이 하 생 략 ~~
② SSLCertificateKeyFile 명령 수정
$ sudo vim /etc/httpd/conf.d/ssl.conf
~~ 이 하 생 략 ~~
# Server Private Key:
# If the key is not combined with the certificate, use this
# directive to point at the key file. Keep in mind that if
# you've both a RSA and a DSA private key you can configure
# both in parallel (to also allow the use of DSA ciphers, etc.)
# SSLCertificateKeyFile /etc/pki/tls/private/localhost.key // 주석처리
SSLCertificateKeyFile /etc/pki/tls/private/custom.key
~~ 이 하 생 략 ~~
08) Apache Web Server 재시작
다시한번 Apache 웹 서버를 재시작 해주고 https://www.도메인주소.com을 입력한다.
$ sudo systemctl restart httpd
09) Qualys SSL labs 분석 결과 확인
Apache 웹 서버가 재시작 되었다면 Qualys SSL labs에 접속하여 사이트의 상세 분석 결과를 받아보자.
구분 | 점수 |
종합등급 | T |
증명서( Certificate ) | 0% |
프로토콜 지원( Protocol Support ) | 100% |
키 교환( Key Exchange ) | 90% |
암호화 수준( Cipher Strength ) | 90% |
해당 포스팅의 현재까지의 진행 결과는 위와 같다.
종합등급을 A받기위해 다음 단계로 넘어가도록 한다.
#4. 보안 구성 테스트 및 강화
01) TLS 구성을 수정하고 향후에 대비
SSLProtocol all -SSLv3 설정을 #주석처리하고 SSLProtocol -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 +TLSv1.2 를 추가한다.
$ sudo vim /etc/httpd/conf.d/ssl.conf
~~ 이 하 생 략 ~~
# SSL Protocol support:
# List the enable protocol levels with which clients will be able to
# connect. Disable SSLv2 access by default:
# SSLProtocol all -SSLv3 // #주석처리
SSLProtocol -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 +TLSv1.2 // 내용추가
~~ 이 하 생 략 ~~
이러한 명령은 SSL 버전 2 및 3과 TLS 버전 1.0 및 1.1을 명시적으로 비활성화한다.
이제 이 서버는 TLS 1.2 이외의 프로토콜을 사용하는 클라이언트와의 암호화된 연결을 허용하지 않는다.
명령의 상세 내용은 서버의 구성 내용을 사람에게 더욱 명확히 전달한다.
02) 허용된 암호 목록 수정
VIM 편집기로 ssl.conf 파일을 열고 SSLCipherSuite 명령이 포함된 섹션을 찾고 기존의 줄을 #주석처리한다.
$ sudo vim /etc/httpd/conf.d/ssl.conf
~~ 이 하 생 략 ~~
# SSL Cipher Suite:
# List the ciphers that the client is permitted to negotiate.
# See the mod_ssl documentation for a complete list.
# SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA // # 주석처리
~~ 이 하 생 략 ~~
이제 명시적 암호 그룹과 전방향 보안을 우선 순위에 두고 부정확한 암호를 방지하는 암호 오더를 지정해 주어야 한다.
여기에 사용된 SSLCipherSuite 명령은 서버에서 실행되는 특정 소프트웨어에 맞게 TLS 구성을 조정하는 Mozilla SSL configuration Generator의 출력에 기반하여 수정할 것이다.
Mozilla SSL Configuration Generator 접속하여 TLS 구성에 따른 사용자의 SSLCipherSuite 값을 구한다.
② 모질라 권장구성( Mozilla Configuration )은 중간( Intermediate )를 선택한다.
- 최신 : 이전 버전과의 호환성 없이 TLS 1.3을 지원하는 최신 클라이언트
- 중간 : 범용 서버에 권장되는 구성( 해당 포스팅은 중간( 범용 )으로 진행 )
- 기존 : Internet Explorer 8(윈도우즈 XP), Java 6 또는 Open과 같은 매우 오래된 클라이언트 또는 라이브러리에서 액세스한 서비스SSL 0.9.8
③ 서버 버전( Server Version )은 아래 명령으로 아파치 버전을 확인하고 기입한다.
Apache 버전 확인( httpd.x86_64 : 버전 2.4.51-1 )
$ yum list installed | grep httpd
generic-logos-httpd.noarch 18.0.0-4.amzn2 @amzn2-core
httpd.x86_64 2.4.51-1.amzn2 @amzn2-core
httpd-filesystem.noarch 2.4.51-1.amzn2 @amzn2-core
httpd-tools.x86_64 2.4.51-1.amzn2 @amzn2-core
④ 오픈SSL 버전( OpenSSL Version )은 아래 명령으로 오픈SSL 버전을 확인하고 기입한다.
$ yum list installed | grep openssl
openssl.x86_64 1:1.0.2k-19.amzn2.0.10 installed
openssl-libs.x86_64 1:1.0.2k-19.amzn2.0.10 installed
그럼 화면 하단에 자동으로 설정값을 구성하는 코드가 출력된다.
그럼 생성된 SSLCipherSuite 명령의 값을 복사한다.
$ sudo vim /etc/httpd/conf.d/ssl.conf
~~ 이 하 생 략 ~~
# SSL Cipher Suite:
# List the ciphers that the client is permitted to negotiate.
# See the mod_ssl documentation for a complete list.
# SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA // #주석처리
SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256 // <- 내용 추가
~~ 이 하 생 략 ~~
※ 2022.11.16일
/etc/letsencrypt/options-ssl-apache.conf 를 확인하면 생성한 SSLCipherSuite의 값이 존재하는것을 확인했다.
언제 생성되는지 다시한번확인해 보자.
03) 허용된 암호의 실행 순서
마지막으로 SSLHonorCipherOrder 명령을찾아 #주석을 제거해준다.
$ sudo vim /etc/httpd/conf.d/ssl.conf
~~ 이 하 생 략 ~~
# Speed-optimized SSL Cipher configuration:
# If speed is your main concern (on busy HTTPS servers e.g.),
# you might want to force clients to specific, performance
# optimized ciphers. In this case, prepend those ciphers
# to the SSLCipherSuite list, and enable SSLHonorCipherOrder.
# Caveat: by giving precedence to RC4-SHA and AES128-SHA
# (as in the example below), most connections will no longer
# have perfect forward secrecy - if the server's key is
# compromised, captures of past or future traffic must be
# considered compromised, too.
#SSLCipherSuite RC4-SHA:AES128-SHA:HIGH:MEDIUM:!aNULL:!MD5
SSLHonorCipherOrder on // #주석제거
~~ 이 하 생 략 ~~
SSLHonorCipherOrder 명령은 서버에서 순위가 높은 암호를 사용하도록 유도한다.
명령의 값이 on으로 설정되면 서버에 요청이 들어올 때 가장 먼저 제일 강력한 보안연결 접속을 테스트 하고
실패하면 차츰 더 낮은 레벨의 보안 연결 설정을 시도하게 된다.
04) Apache Web Server 재시작
$ sudo systemctl restart httpd
Apache 웹 서버가 정상적으로 재시작 되어야 한다.
#5. Amazon Linux 2에서 Cerbot의 Let's Encrypt
Certbot은 Let's Encrypt 인증서를 자동으로 발급 및 갱신을 해주는 봇 프로그램을 의미하며
Lest's Encrypt의 경우 HTTPS의 확산을 늘리기 위한 취지로 시작된 비영리 단체를 말한다.
자세한 설명은 아래 내용을 확인하고 작업을 진행한다.
Let's Encrypt 인증 기관은 전체 인터넷을 암호화하기 위한 전자 프런티어 재단( EFF : Electronic Frontier Foundation)으로 사용자에게 무료로 TLS 인증서를 발급해주는 비영리기관이다.
몇 가지 TLS 인증서 종류 중에서 완전 자동화가 가능한 DV (Domain Validated, 도메인 확인) 인증서를 무료로 발급한다.
루트 도메인 (네이키드 도메인), 특정 서브 도메인 뿐만 아니라, 하나의 인증서로 모든 서브 도메인에 사용 가능한 *.example.com 형태의 와일드카드 서브 도메인 인증서도 무료로 발급하므로 그 활용이 폭넓다.
Let's Encrypt host certificate는 최소한의 사용자 개입으로 생성, 검증, 설치 및 유지관리되도록 설계되었다. 인증서 관리의 자동화된 측면은 웹 서버에서 실행되는 소프트웨어 에이전트에 의해 수행됩니다. 에이전트를 설치하고 구성하면 에이전트가 Let's Encrypt와 안전하게 통신하고 Apache 및 키 관리 시스템에서 관리 작업을 수행합니다.
발급된 인증서는 유효기간이 90일이며 만료 30일 전부터 갱신할 수 있다. 갱신 가능 횟수는 무제한이다.
( 이런 서비스가 필요한 이유는 인증서 가격이 3만원에 이르고 와일드카드의 경우 15만원에 이르러 1년동안 제공되지만 결제는 엔지니어에겐 귀찮고 번거로운 일이다. 최소한의 이런 불편한 부분을 자동화해준다. )
사용자 정의된 암호화 키를 인증서의 기준으로 제공하거나 에이전트 스스로 기본값에 따라 키를 만들 수 있으므로 무료 Certbot 에이전트를 사용합니다. 또한 Certbot 자동화 방법에 설명된 대로 사용자의 작업 없이 정기적으로 인증서를 갱신하도록 Certbot을 구성할 수 있습니다.
Certbot은 Amazon Linux 2에서 공식적으로 지원되지 않지만 다운로드가 가능하고 설치하면 제대로 작동합니다. 다음과 같이 백업을 만들어 데이터를 보호하고 불편을 피하는 것이 좋다.
이번 단락에서는 Certbot을 생성하고 리눅스의 CrontTab 기능을 사용하여 자동으로 갱신할 수 있게 설정한다.
01) Certbot 설치 준비
홈 디렉터리로 이동하여 작업을 진행한다.
$ cd /home/ec2-user
EPEL 다운로드
$ sudo wget -r --no-parent -A 'epel-release-*.rpm' https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/
리포지토리 패키지 설치
$ sudo rpm -Uvh dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-*.rpm
설치가 완료되었다면 아래 명령으로 EPEL을 활성화 한다.
$ sudo yum-config-manager --enable epel*
EPEL이 활성화 되었는지 확인한다.
$ sudo yum repolist all
repo id repo name status
amzn2-core/2/x86_64 Amazon Linux 2 core repository enabled: 26,801amzn2-core-debuginfo/2/x86_64 Amazon Linux 2 core repository - debuginfo packages disabled
amzn2-core-source/2 Amazon Linux 2 core repository - source packages disabled
amzn2extra-docker/2/x86_64 Amazon Extras repo for docker enabled: 55amzn2extra-docker-debuginfo/2/x86_64 Amazon Extras debuginfo repo for docker disabled
amzn2extra-docker-source/2 Amazon Extras source repo for docker disabled
epel/x86_64 Extra Packages for Enterprise Linux 7 - x86_64 enabled: 13,479+208epel-debuginfo/x86_64 Extra Packages for Enterprise Linux 7 - x86_64 - Debug enabled: 2,884epel-source/x86_64 Extra Packages for Enterprise Linux 7 - x86_64 - Source enabled: 0epel-testing/x86_64 Extra Packages for Enterprise Linux 7 - Testing - x86_64 enabled: 329+1epel-testing-debuginfo/x86_64 Extra Packages for Enterprise Linux 7 - Testing - x86_64 - Debug enabled: 37epel-testing-source/x86_64 Extra Packages for Enterprise Linux 7 - Testing - x86_64 - Source enabled: 0
그러면 위와 비슷한 정보가 반환된다.
이제 Apache 웹 서버 사용을 위한 버츄얼 호스트( VirtualHost )설정을 추가한다.
$ sudo vim /etc/httpd/conf.d/virtual-host.conf
<VirtualHost *:80>
ServerName 도메인주소.com
ServerAlias www.도메인주소.com, *.도메인주소.com
ServerAdmin 이메일주소
DocumentRoot /var/www/html
<Directory /var/www/html>
Options Indexes FollowSymlinks
AllowOverride all
Require all granted
</Directory>
</VirtualHost>
명령 | 설명 |
ServerName | 클라이언트에게 보여주는 호스트 이름을 지정한다. |
ServerAlias | 호스트의 추가적인 별칭을 지정한다. 이름을 줄때 와일드카드 문자 *와 ?를 사용할 있다. |
ServerAdmin | 웹문서 로딩시 에러가 발생한 경우 에러페이지에 나타나는 관리자 메일 주소이다. |
DocumentRoot | 서버의 웹 문서가 있는 경로를 지정한다. 경로의 마지막에 "/"를 추가하면 안된다. |
마지막으로 Apache 웹 서버를 재시작해 준다.
$ sudo systemctl restart httpd
02) Certbot 설치 및 실행
먼저 Certbot 종속성 패키지를 설치한다.
$ sudo yum install -y certbot python2-certbot-apache
패키지 설치가 완료되면 Certbot을 실행한다.
$ sudo certbot
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator apache, Installer apache
Enter email address (used for urgent renewal and security notices)
(Enter 'c' to cancel): 이메일 주소 입력
약관에 동의한다.( Y )
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y
EFF의 소식을 이메일로 받을지 선택한다.( Y 혹은 N )
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y 혹은 N 선택입력
해당 포스팅은 N을 입력하고 진행하였다.
그럼 Certbot은 VirtualHost 블록에 입력한 일반 도메인명 및 주체 대체 도메인 이름을 표시한다.
Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: example.com
2: www.example.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): Enter
아무것도 입력하지 않고 Enter를 누르고 진행하였다.
그럼 Certbot은 Apache의 구성을 완료하고 성공 및 기타 정보를 보고한다.
Congratulations! You have successfully enabled https://example.com and
https://www.도메인주소.com
You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=도메인주소.com
https://www.ssllabs.com/ssltest/analyze.html?d=www.도메인주소.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/www.도메인주소.com/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/www.도메인주소.com/privkey.pem
Your cert will expire on 2019-08-01. To obtain a new or tweaked
version of this certificate in the future, simply run certbot again
with the "certonly" option. To non-interactively renew *all* of
your certificates, run "certbot renew"
- Your account credentials have been saved in your Certbot
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Certbot so
making regular backups of this folder is ideal.
위 내용을 확인하면 SSL 세팅과 관련한 *.pem 파일들이 생성된 것을 확인 할 수 있다.
SSLCertificateFile | /etc/letsencrypt/live/www.도메인주소.com/fullchain.pem |
SSLCertificateKeyFile | /etc/letsencrypt/live/www.도메인주소.com/privkey.pem |
SSLCertificateChainFile | /etc/letsencrypt/live/www.도메인주소.com/privkey.pem |
SSLCACertificateFile | /etc/letsencrypt/live/www.도메인주소.com/privkey.pem |
이후 Apache 서버를 통한 Mod_Proxy 설정등에 사용될 수 있기에 기억해 두자.
설정된 *.pem 파일을 통한 Apache 서버의 Mod_Proxy설정의 내용은 해당 포스팅을 참고하자.
03) CertTab을 이용한 인증서 자동 갱신 구성
$ sudo vim /etc/crontab
39 1,13 * * * root certbot renew --no-self-upgrade
① 시간 : 39, 1, 13 * * *
매일 01:39와 13:39에 실행되도록 예약한다.
② 실행 권한 : root
명령은 루트 권한으로 실행됩니다.
③ 실행 명령 : certbot renew --no-self-upgrade
renew 하위 명령을 사용하면 Certbot이 이전에 얻은 모든 인증서가 점검하고 만료 날짜가 다가오고 있는 인증서를 갱신한다.
--no-self-upgrade 플래그를 사용하면 Certbot이 사용자의 개입 없이 자체 업그레이드하지 않는다.
$ sudo systemctl restart crond
#6. 브라우저를 통산 서버 보안 연결 테스트
이전과 다르게 보안 연결 실패 및 위험 경고가 뜨지 않는것을 확인할 수 있다.
다시 Qualys SSL labs에 접속하여 사이트의 상세 분석 결과를 받아보자.
구분 | 점수 |
종합등급 | A |
증명서( Certificate ) | 100% |
프로토콜 지원( Protocol Support ) | 100% |
키 교환( Key Exchange ) | 90% |
암호화 수준( Cipher Strength ) | 90% |
Let's Encrypt 인증서 만료일 확인
$ sudo certbot certificates
Saving debug log to /var/log/letsencrypt/letsencrypt.log
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Found the following certs:
Certificate Name: www.도메인주소.com
Serial Number: 37921267c039b0c086f368eb46f3db91c02
Key Type: RSA
Domains: www.도메인주소.com pofol.도메인주소.com sample.도메인주소.com tomcat.도메인주소.com
Expiry Date: 2024-11-20 12:41:17+00:00 (VALID: 62 days)
Certificate Path: /etc/letsencrypt/live/www.도메인주소.com/fullchain.pem
Private Key Path: /etc/letsencrypt/live/www.도메인주소.com/privkey.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
해당 포스팅의 내용을 진행하고, Apache 서버와 Tomcat WAS를 사용중이라면
[Linux] CentOS7 - HTTPS 접속을 위한 Apache 웹 서버의 Mod_Proxy 설정
내용을 추가적으로 진행하는것을 추천한다.
'AWS' 카테고리의 다른 글
[AWS] Lmabda + DynamoDB 사용하기 (0) | 2024.04.30 |
---|---|
[AWS] 데이터 베이스 환경 생성 - MariaDB (0) | 2021.12.23 |
[AWS] 버전 관리 시스템 - GIT 원격지 서버 구축 (0) | 2021.07.08 |
[AWS] EC2 - Amazon Linux 2 AMI 서버 구축 (0) | 2021.07.06 |