메뉴
Amazon Elastic Compute Cloud
Linux 인스턴스용 사용 설명서

자습서: SSL/TLS를 사용하여 Amazon Linux에서 Apache 웹 서버 구성

Secure Sockets Layer/Transport Layer Security(SSL/TLS)는 웹 서버와 웹 클라이언트 간 암호화된 채널을 만들어 전송 중인 데이터가 도청되지 않도록 보호합니다. 이 자습서에서는 Apache 웹 서버를 실행하는 Amazon Linux의 단일 인스턴스에 SSL/TLS 지원을 수동으로 추가하는 방법을 설명합니다. AWS Certificate Manager는 여기에서 설명하진 않지만, 상용 등급 서비스를 제공해야 할 경우 특히 적합한 옵션입니다.

참고

일반적으로 웹 암호화를 단순히 SSL이라고 부릅니다. 웹 브라우저에서 여전히 SSL을 지원하지만, 후속 프로토콜인 TLS가 공격에 덜 취약한 것으로 여겨집니다. Amazon Linux는 기본적으로 모든 SSL 버전을 사용하지 않지만, 아래에 설명된 대로 TLS 버전 1.0을 사용하지 않을 것을 권장합니다. 업데이트된 암호화 표준에 대한 자세한 내용은 RFC 7568을 참조하십시오.

중요

이 절차는 Amazon Linux에서 사용하기 위한 것입니다. LAMP 웹 서버를 다른 배포 인스턴스에서 설치하려는 경우는 본 자습서를 이용할 수 없습니다. Ubuntu의 LAMP 웹 서버에 대한 자세한 내용은 Ubuntu 커뮤니티 문서 ApacheMySQLPHP 섹션을 참조하십시오. Red Hat Enterprise Linux에 대한 자세한 내용은 고객 포털 주제 웹 서버를 참조하십시오.

사전 조건

이 자습서를 시작하기 전에 다음 단계를 완료합니다.

  • EBS 지원 Amazon Linux 인스턴스를 시작합니다. 자세한 내용은 1단계: 인스턴스 시작 섹션을 참조하십시오.

  • 보안 그룹을 인스턴스가 다음 TCP 포트에서 연결을 허용하도록 구성합니다.

    • SSH(포트 22)

    • HTTP(포트 80)

    • HTTPS(포트 443)

    자세한 내용은 Amazon EC2로 설정 섹션을 참조하십시오.

  • Apache 웹 서버를 설치합니다. 단계별 지침은 자습서: Amazon Linux에 LAMP 웹 서버 설치를 참조하십시오. http24 패키지와 그 종속 프로그램만 필요합니다. PHP 및 MySQL과 관련된 지침은 무시해도 됩니다.

  • 웹 사이트를 식별하고 인증하려면 SSL/TLS 퍼블릭 키 인프라(PKI)는 도메인 이름 시스템(DNS)을 사용합니다. EC2 인스턴스를 사용하여 퍼블릭 웹 사이트를 호스팅하려는 경우, 웹 서버의 도메인 이름을 등록하거나 Amazon EC2 호스트로 기존 도메인 이름을 전송해야 합니다. 수많은 타사 도메인 등록 및 DNS 호스팅 서비스를 이에 사용할 수 있습니다. 또는 Amazon Route 53을 사용할 수도 있습니다.

1단계: 서버에서 SSL/TLS 활성화

이 절차에서는 자체 서명된 디지털 인증서를 사용하여 Amazon Linux에 SSL/TLS를 설치하는 과정을 보여 줍니다.

참고

자체 서명된 인증서는 테스트에는 허용되지만 프로덕션에는 허용되지 않습니다. 자체 서명된 인증서를 인터넷에 노출하면 사이트 방문자에게 인사말로 보안 경고가 표시됩니다.

서버에서 SSL/TLS를 활성화하려면

  1. 인스턴스에 연결한 다음 Apache가 실행되는지 확인합니다.

    Copy
    [ec2-user ~]$ sudo service httpd status

    필요한 경우 Apache를 시작합니다.

    Copy
    [ec2-user ~]$ sudo service httpd start
  2. 모든 소프트웨어 패키지가 최신 상태로 업데이트되어 있는지 확인하기 위해, 인스턴스에서 퀵 소프트웨어 업데이트를 실행합니다. 이 업데이트 과정은 몇 분 정도 시간이 소요될 수 있지만, 최신 보안 업데이트와 버그 수정을 위해 수행할 필요가 있습니다.

    참고

    -y 옵션을 사용하면 확인 여부를 묻지 않고 업데이트를 설치합니다. 설치 전에 업데이트 정보를 확인하려면 이 옵션을 생략합니다.

    Copy
    [ec2-user ~]$ sudo yum update -y
  3. 이제 인스턴스가 최신 상태이므로 다음과 같은 Apache module mod_ssl을 설치하여 SSL/TLS 지원을 추가합니다.

    Copy
    [ec2-user ~]$ sudo yum install -y mod24_ssl

    이 자습서에서 나중에 다음과 같은 설치된 세 가지 중요한 파일을 작업합니다.

    • /etc/httpd/conf.d/ssl.conf

      mod_ssl의 구성 파일입니다. 이 파일에는 Apache에 암호화 키 및 인증서의 위치, 허용하는 SSL/TLS 프로토콜 버전, 허용하는 암호화 암호를 알려주는 "명령"이 포함되어 있습니다.

    • /etc/pki/tls/private/localhost.key

      Amazon EC2 호스트의 2048비트 RSA 프라이빗 키로, 자동으로 생성됩니다. 설치하는 동안 OpenSSL은 이 키를 사용하여 자체 서명된 호스트 인증서를 생성하며, 이 키를 사용하여 인증 기관(CA)에 제출할 인증서 서명 요청(CSR)을 생성할 수 있습니다.

    • /etc/pki/tls/certs/localhost.crt

      서버 호스트의 자체 서명된 X.509 인증서로, 자동으로 생성됩니다. 이 인증서는 Apache가 SSL/TLS를 사용하도록 올바르게 설치되었는지 테스트하는 데 유용합니다.

    .key.crt 파일은 모두 PEM 형식입니다. 이 형식은 아래의 축약된 인증서 예제와 같이 "BEGIN" 및 "END" 라인으로 프레임 처리된 Base64 인코딩 ASCII 문자로 구성됩니다.

                            -----BEGIN CERTIFICATE-----
                            MIIEazCCA1OgAwIBAgICWxQwDQYJKoZIhvcNAQELBQAwgbExCzAJBgNVBAYTAi0t
                            MRIwEAYDVQQIDAlTb21lU3RhdGUxETAPBgNVBAcMCFNvbWVDaXR5MRkwFwYDVQQK
                            DBBTb21lT3JnYW5pemF0aW9uMR8wHQYDVQQLDBZTb21lT3JnYW5pemF0aW9uYWxV
                            bml0MRkwFwYDVQQDDBBpcC0xNzItMzEtMjAtMjM2MSQwIgYJKoZIhvcNAQkBFhVy
                            ...
                            z5rRUE/XzxRLBZOoWZpNWTXJkQ3uFYH6s/sBwtHpKKZMzOvDedREjNKAvk4ws6F0
                            WanXWehT6FiSZvB4sTEXXJN2jdw8g+sHGnZ8zCOsclknYhHrCVD2vnBlZJKSZvak
                            3ZazhBxtQSukFMOnWPP2a0DMMFGYUHOd0BQE8sBJxg==
                            -----END CERTIFICATE-----                    

    파일 이름 및 확장명은 편의상 사용되며 기능에 영향을 미치지 않습니다. ssl.conf 파일에서 관련 명령에 동일한 이름을 사용하는 한, 인증서 이름을 cert.crt 또는 cert.pem 또는 다른 파일 이름으로 지정할 수 있습니다.

    참고

    기본 SSL/TLS 파일을 고유의 사용자 지정 파일로 대체하는 경우 파일이 PEM 형식인지 확인하십시오.

  4. Apache를 다시 시작합니다.

    Copy
    [ec2-user ~]$ sudo service httpd restart

    참고

    TCP 포트 443은 위에서 설명한 대로 EC2 인스턴스에서 액세스할 수 있습니다.

  5. Apache 웹 서버가 현재 포트 443에 대해 HTTPS(보안 HTTP)를 지원해야 합니다. 접두사가 https://인 브라우저 URL 표시줄에 IP 주소 또는 EC2 인스턴스의 정규화된 도메인 이름을 입력하여 이를 테스트합니다. 신뢰할 수 없는 자체 서명된 호스트 인증서를 사용하여 사이트에 연결하기 때문에 브라우저에 보안 경고가 연속으로 표시될 수 있습니다.

    경고를 무시하고 계속 진행합니다. Apache 기본 테스트 페이지가 열리면 서버에 SSL/TLS가 구성되었다는 것입니다. 브라우저와 서버 사이를 통과하는 모든 데이터가 이제 안전하게 암호화됩니다.

    사이트 방문자에게 경고 화면이 표시되는 것을 방지하려면 암호화뿐만 아니라 해당 사이트의 소유자라는 것을 공개적으로 인증하는 인증서를 가져와야 합니다.

2단계: CA가 서명한 인증서 가져오기

이 섹션에서는 프라이빗 키에서 인증서 서명 요청(CSR)을 생성하고, 인증 기관(CA)에 CSR을 제출하고, 서명된 호스트 인증서를 가져오고, Apache를 구성하여 이를 사용하는 절차를 설명합니다.

자체 서명된 SSL/TLS X.509 호스트 인증서는 CA가 서명한 인증서와 암호적으로 동일합니다. 그 차이는 수학적인 것이 아니라 사회적입니다. CA는 신청자에게 인증서를 발급하기 전에 도메인의 소유권을 최소한으로 검사합니다. 각 웹 브라우저에는 이를 하도록 브라우저 공급업체에서 신뢰한 CA 목록이 포함되어 있습니다. X.509 인증서는 프라이빗 서버 키에 해당하는 퍼블릭 키와 퍼블릭 키에 암호화 방식으로 연결된 CA의 서명으로 주로 구성되어 있습니다. 브라우저가 HTTPS를 통해 웹 서버에 연결되면 서버는 브라우저에서 신뢰할 수 있는 CA 목록을 확인하도록 인증서를 제공합니다. 서명자가 목록에 있거나 신뢰할 수 있는 다른 서명자로 구성되는 신뢰 체인을 통해 서명자에 액세스할 수 있는 경우, 브라우저는 서버와 암호화된 빠른 데이터 채널을 협상하고 페이지를 로드합니다.

요청 확인 절차로 인해 인증서에는 일반적으로 비용이 발생하므로 여러 인증 기관을 알아봐야 합니다. 잘 알려진 CA 목록은 dmoztools.net에서 확인할 수 있습니다. 일부 CA는 기본 수준 인증서를 무료로 제공합니다. 이 중 가장 주목할 만한 것은 Let's Encrypt 프로젝트인데, 이것은 인증서 생성 및 갱신 프로세스의 자동화도 지원합니다. Let's Encrypt as your CA 사용에 대한 자세한 내용은 부록: Amazon Linux에서 Certbot의 Let's Encrypt 섹션을 참조하십시오.

호스트 인증서의 기본을 이루는 것은 키입니다. 2017년 현재 정부산업 그룹에서는 2030년까지 문서를 보호하기 위해 마련된 RSA 키에 대해 최소 2048비트의 키(모듈러스) 크기를 사용할 것을 권장합니다. Amazon Linux의 OpenSSL에서 생성된 기본 모듈러스 크기는 2048비트이므로, 기존의 자동 생성된 키를 CA가 서명한 인증서에 사용할 수 있습니다. 예를 들면, 모듈러스가 더 크거나 다른 암호화 알고리즘을 사용하는 사용자 지정 키를 원하는 경우 아래 절차를 참조합니다.

CA가 서명한 인증서를 가져오려면

  1. 인스턴스에 연결한 다음 /etc/pki/tls/private/으로 이동합니다. 이는 SSL/TLS에 대한 서버의 프라이빗 키가 저장된 디렉터리입니다. 기존 호스트 키를 사용하여 CSR을 생성하려면 3단계로 건너뜁니다.

  2. (선택 사항) 새 프라이빗 키를 생성합니다. 다음은 몇 가지 키 구성 샘플입니다. 어떤 결과 키도 웹 서버에서 사용할 수 있지만 어떻게(또한 얼마나) 보안을 구현할지는 각각 다릅니다.

    1. 다음은 이를 위한 첫 단계로써 인스턴스의 기본 호스트 키와 유사한 RSA 키를 생성하는 명령입니다.

      Copy
      [ec2-user ~]$ sudo openssl genrsa -out custom.key 2048

      결과 파일인 custom.key는 2048비트 RSA 프라이빗 키입니다.

    2. 모듈러스가 더 크고 더욱 강력한 RSA 키를 생성하려면 다음 명령을 사용합니다.

      Copy
      [ec2-user ~]$ sudo openssl genrsa -out custom.key 4096

      결과 파일인 custom.key는 4096비트 RSA 프라이빗 키입니다.

    3. 암호로 보호되는 4096비트 암호화 RSA 키를 생성하려면 다음 명령을 사용합니다.

      Copy
      [ec2-user ~]$ sudo openssl genrsa -aes128 -passout pass:abcde12345 -out custom.key 4096

      그러면 AES-128 암호화로 암호화된 4096비트 RSA 프라이빗 키가 생성됩니다.

      중요

      암호화를 통해 보안을 강화할 수 있지만, 암호화된 키에는 암호가 필요하기 때문에 이를 사용하는 서비스는 자동으로 시작할 수 없습니다. 이 키를 사용할 때마다 SSH 연결을 통해 암호 "abcde12345"를 입력해야 합니다.

    4. RSA 암호화는 상대적으로 느린데, 그 보안 체계가 큰 두 개의 소수를 소인수 분해하는 것의 난해성에 기반을 두기 때문입니다. 그러나 RSA 암호화 이외의 암호화를 사용하는 SSL/TLS의 키를 생성할 수 있습니다. 타원 곡선 수학을 기반으로 하는 키는 동등한 보안 수준을 제공할 때보다 작고 산술적으로 빠릅니다. 다음은 그 예입니다.

      Copy
      [ec2-user ~]$ sudo openssl ecparam -name prime256v1 -out custom.key -genkey

      이 예에서 출력은 OpenSSL에서 지원하는 "명명된 곡선"인 prime256v1을 사용하는 256비트 타원 곡선 프라이빗 키입니다. NIST에 따르면 이 키의 암호화 강도는 2048비트 RSA 키보다 약간 더 높습니다.

      참고

      모든 CA에서 타원 곡선 기반 키에 대해 RSA 키와 동등한 수준의 지원을 제공하지는 않습니다.

    새 프라이빗 키의 소유권 및 권한은 매우 제한적(소유자=루트, 그룹=루트, 소유자 전용 읽기/쓰기)이어야 합니다. 명령은 다음과 같습니다.

    Copy
    [ec2-user ~]$ sudo chown root.root custom.key [ec2-user ~]$ sudo chmod 600 custom.key [ec2-user ~]$ ls -al custom.key

    위 명령의 결과는 다음과 같아야 합니다.

    -rw------- root root custom.key

    만족스러운 키를 생성 및 구성한 후 CSR을 생성할 수 있습니다.

  3. 원하는 키를 사용하여 CSR을 생성합니다. 아래 예에서는 custom.key를 사용합니다.

    Copy
    [ec2-user ~]$ sudo openssl req -new -key custom.key -out csr.pem

    OpenSSL은 대화 상자를 열고 아래 표의 정보를 입력하라는 메시지를 표시합니다. 도메인에서 확인된 기본 호스트 인증서의 경우 Common Name을 제외한 모든 필드는 선택 사항입니다.

    이름 설명
    국가 이름 해당 국가의 두 자리 ISO 약자. US(=미국)
    주 또는 지방 이름 해당 조직이 위치한 주 또는 지방의 이름. 이 이름은 약어로 사용할 수 없음. 워싱턴
    시 이름 조직의 위치(예: 도시). Seattle
    조직 이름 해당 조직의 정식 이름. 조직 이름의 약칭을 사용하지 마십시오. Example Corporation
    조직 단위 이름 조직에 대한 추가 정보(있는 경우). 부서 예
    일반 이름

    이 값은 사용자가 브라우저에 입력해야 하는 웹 주소와 정확히 일치해야 합니다. 일반적으로 이는 www.example.com의 형식으로, 호스트 이름 또는 별칭이 앞에 붙는 도메인 이름을 뜻합니다. 자체 서명된 인증서로 DNS 확인 없이 테스트하는 경우, 일반 이름은 호스트 이름만으로 구성될 수 있습니다. CA는 *.example.com과 같이 와일드 카드 이름을 허용하는 비싼 인증서도 제공합니다.

    www.example.com
    이메일 주소 서버 관리자의 이메일 주소. someone@example.com

    마지막으로 OpenSSL은 챌린지 암호(선택 사항)를 입력하라는 메시지를 표시합니다. 이 암호는 해당 CSR 및 사용자와 해당 CA 간의 트랜잭션에만 적용되므로, 암호 및 기타 선택적 필드(선택적 회사 이름)에 대한 해당 CA의 권장 사항을 따릅니다. CSR 챌린지 암호는 서버 작업에 영향을 미치지 않습니다.

    결과 파일인 csr.pem에는 퍼블릭 키, 퍼블릭 키의 디지털 서명 및 입력한 메타데이터가 포함되어 있습니다.

  4. CA에 CSR을 제출합니다. 이는 보통 텍스트 편집기에서 CSR 파일을 열고 웹 양식에 내용을 복사하는 것으로 구성됩니다. 이때 인증서에 추가할 하나 이상의 주체 대체 이름(SAN)을 입력하라는 메시지가 나타날 수 있습니다. www.example.com이 일반 이름일 경우, example.com은 좋은 SAN이며, 그 반대의 경우도 마찬가지입니다. 사이트 방문자는 이 이름 중 하나를 입력하면 오류 없이 연결됩니다. CA 웹 양식에서 이를 허용하는 경우, SAN 목록에 일반 이름을 포함시킵니다. 일부 CA는 이를 자동으로 포함시킵니다.

    요청이 승인되면 CA에서 서명한 새 호스트 인증서를 받게 됩니다. CA의 신뢰 체인을 완료하는 데 필요한 추가 인증서가 포함된 중간 인증서 파일을 다운로드하라는 안내를 받을 수도 있습니다.

    참고

    CA는 다양한 목적을 위해 마련된 여러 형식의 파일을 보낼 수 있습니다. 본 자습서에서는 PEM 형식의 인증서 파일만 사용해야 하는데, 이는 보통 .pem 또는 .crt 확장명으로 표시되지만 항상 그런 것은 아닙니다. 어떤 파일을 사용할지 확실하지 않은 경우 텍스트 편집기로 파일을 열고 다음으로 시작되는 블록 하나 이상이 포함되는 파일을 찾습니다.

    - - - - -BEGIN CERTIFICATE - - - - - 

    또한 파일은 다음으로 끝나야 합니다.

    - - - -END CERTIFICATE - - - - -

    또한 명령줄의 파일을 다음과 같이 테스트할 수 있습니다.

    Copy
    [ec2-user certs]$ openssl x509 -in certificate.crt -text

    앞서 설명한 텔테일 줄에 대한 출력을 검사합니다. .p7b, .p7c, 또는 유사한 확장명으로 끝나는 파일을 사용하지 않습니다.

  5. /etc/pki/tls/certs 디렉터리에서 자체 서명된 이전 호스트 인증서인 localhost.crt를 제거하거나 이름을 바꾸고 해당 디렉터리에 (중간 인증서와 함께) CA가 서명한 새 인증서를 추가합니다.

    참고

    여러 가지 방법으로 새 인증서를 EC2 인스턴스에 업로드할 수 있지만, 가장 간편하고 유익한 방법은 텍스트 편집기(vi, nano, 메모장 등)를 로컬 컴퓨터와 인스턴스에 모두 열고 두 편집기 간에 파일 콘텐츠를 복사하여 붙이는 것입니다. EC2 인스턴스에서 이러한 작업을 수행할 때 루트 [sudo] 권한이 필요합니다. 이렇게 하면 권한 또는 경로 문제가 있는 경우 즉시 확인할 수 있습니다. 하지만 콘텐츠를 복사하는 동안 라인을 추가하거나 어떤 식으로든 콘텐츠를 변경하지 않도록 주의하십시오.

    /etc/pki/tls/certs 디렉터리 내에서 파일 소유권, 그룹 및 권한 설정이 매우 제한적인 Amazon Linux 기본값(소유자=루트, 그룹=루트, 소유자 전용 읽기/쓰기)과 일치하는지 확인합니다. 명령은 다음과 같습니다.

    Copy
    [ec2-user certs]$ sudo chown root.root custom.crt [ec2-user certs]$ sudo chmod 600 custom.crt [ec2-user certs]$ ls -al custom.crt

    위 명령의 결과는 다음과 같아야 합니다.

    -rw------- root root custom.crt

    중간 인증서 파일에 대한 권한은 덜 엄격합니다(소유자=루트, 그룹=루트, 소유자 쓰기 가능, 그룹 읽기 가능, 모든 사용자 읽기 가능). 이 명령은 다음과 같습니다.

    Copy
    [ec2-user certs]$ sudo chown root.root intermediate.crt [ec2-user certs]$ sudo chmod 644 intermediate.crt [ec2-user certs]$ ls -al intermediate.crt

    위 명령의 결과는 다음과 같아야 합니다.

    -rw-r--r-- root root intermediate.crt
  6. 사용자 지정 키를 사용하여 CSR 및 결과로 얻은 호스트 인증서를 생성한 경우 /etc/pki/tls/private/ 디렉터리에서 기존 키를 제거하거나 이름을 바꾼 다음 해당 디렉터리에 새 키를 설치합니다.

    참고

    여러 가지 방법으로 사용자 지정 키를 EC2 인스턴스에 업로드할 수 있지만, 가장 간편하고 유익한 방법은 텍스트 편집기(vi, nano, 메모장 등)를 로컬 컴퓨터와 인스턴스에 모두 열고 두 편집기 간에 파일 콘텐츠를 복사하여 붙이는 것입니다. EC2 인스턴스에서 이러한 작업을 수행할 때 루트 [sudo] 권한이 필요합니다. 이렇게 하면 권한 또는 경로 문제가 있는 경우 즉시 확인할 수 있습니다. 하지만 콘텐츠를 복사하는 동안 라인을 추가하거나 어떤 식으로든 콘텐츠를 변경하지 않도록 주의하십시오.

    /etc/pki/tls/private 디렉터리 내에서 파일 소유권, 그룹 및 권한 설정이 매우 제한적인 Amazon Linux 기본값(소유자=루트, 그룹=루트, 소유자 전용 읽기/쓰기)과 일치하는지 확인합니다. 명령은 다음과 같습니다.

    Copy
    [ec2-user private]$ sudo chown root.root custom.key [ec2-user private]$ sudo chmod 600 custom.key [ec2-user private]$ ls -al custom.key

    위 명령의 결과는 다음과 같아야 합니다.

    -rw------- root root custom.key
  7. 새 CA가 서명한 호스트 인증서(이 예제에서는 custom.crt)는 아마 기존 인증서와 다를 것이기 때문에 /etc/httpd/conf.d/ssl.conf를 편집하고 Apache의 SSLCertificateFile 명령을 사용하여 올바른 경로 및 파일 이름을 제공합니다.

    Copy
    SSLCertificateFile /etc/pki/tls/certs/custom.crt

    중간 인증서 파일을 받은 경우(이 예에서는 intermediate.crt), Apache의 명령을 사용하여 경로 및 파일 이름을 입력합니다:SSLCACertificateFile

    Copy
    SSLCACertificateFile /etc/pki/tls/certs/intermediate.crt

    참고

    일부 CA는 호스트 인증서와 중간 인증서를 단일 파일로 결합하기 때문에 이 명령이 불필요합니다. CA가 제공한 지침을 참조하십시오.

    사용자 지정 프라이빗 키를 설치한 경우(이 예제에서는 custom.key), Apache의 SSLCertificateKeyFile 명령을 사용하여 경로 및 파일 이름을 입력합니다.

    Copy
    SSLCertificateKeyFile /etc/pki/tls/private/custom.key
  8. /etc/httpd/conf.d/ssl.conf를 저장하고 Apache를 다시 시작합니다.

    Copy
    [ec2-user ~]$ sudo service httpd restart

3단계: 보안 구성 테스트 및 강화

SSL/TLS이 작동되고 일반에 공개된 후 이의 실제 보안 수준을 테스트해야 합니다. 보안 설정을 무료로 완벽하게 분석해 주는 Qualys SSL Labs와 같은 온라인 서비스를 사용하면 이를 손쉽게 수행할 수 있습니다. 그 결과에 따라 수용할 프로토콜, 원하는 암호 및 제외할 암호를 관리하여 기본 보안 구성을 강화할 수 있습니다. 자세한 내용은 how Qualys formulates its scores 섹션을 참조하십시오.

중요

실제 테스트는 서버 보안에 매우 중요합니다. 구성상의 작은 오류가 심각한 보안 침해 및 데이터 손실로 이어질 수 있습니다. 권장되는 보안 사례는 연구 및 새롭게 생겨나는 위협에 대처하기 위해 끊임없이 변화하므로 보안 감사를 주기적으로 실시하는 것이 서버 관리에 필수적입니다.

Qualys SSL Labs 사이트에 www.example.com 형식으로 서버의 정규화된 도메인 이름을 입력합니다. 약 2분 후 사이트 등급(A - F) 및 확인된 상세 분석 결과를 받게 됩니다. 아래 표에 Amazon Linux 및 기본 Certbot 인증서의 기본 Apache 구성과 설정이 동일한 도메인에 대한 보고서가 요약되어 있습니다.

종합 등급 B
인증서 100%
프로토콜 지원 95%
키 교환 90%
암호화 수준 90%

이 보고서에 따르면 인증서, 프로토콜 지원, 키 교환 및 암호화 수준이 수용할 만한 등급으로, 구성이 대체로 안전하다는 것을 보여 줍니다. 또한, 이 구성은 프라이빗 키에서 파생된 임시(사용 후 삭제) 세션 키를 사용하여 암호화하는 프로토콜의 기능인 순방향 비밀성을 지원합니다. 이는 실제 공격자가 웹 서버의 장기 프라이빗 키를 보유하고 있더라도 HTTPS 데이터의 암호를 해독할 수 없다는 것을 뜻합니다. 그러나 이 보고서는 또한 종합 등급을 낮춘 한 가지 심각한 취약성을 플래그로 지정하고 있으며, 추가적인 문제 가능성을 가리킵니다.

  1. RC4 암호 지원: 암호는 암호화 알고리즘의 수학적 핵심입니다. SSL/TLS 데이터 스트림을 암호화하는 데 사용하는 빠른 암호인 RC4에는 몇 가지 심각한 취약점이 있는 것으로 알려져 있습니다. 수정 사항은 RC4 지원을 완전히 비활성화하는 것입니다. 또한 명시적 암호 순서 및 금지된 암호의 명시적 목록을 지정합니다.

    /etc/httpd/conf.d/ssl.conf 구성 파일에서 SSLCipherSuiteSSLProxyCipherSuite 구성을 위한 주석 처리된 예가 포함된 섹션을 찾습니다.

    Copy
    #SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5 #SSLProxyCipherSuite HIGH:MEDIUM:!aNULL:!MD5

    이러한 항목을 그대로 두고 그 아래에 다음 명령을 추가합니다.

    참고

    여기에서는 가독성을 위해 여러 줄로 표시했지만, 이 두 가지 명령 각각은 암호 이름 사이에 공백이 없는 한 줄이어야 합니다.

    Copy
    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:AES:!aNULL:!eNULL:!EXPORT:!DES: !RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA SSLProxyCipherSuite 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:AES:!aNULL:!eNULL:!EXPORT:!DES: !RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA

    이러한 암호는 OpenSSL에서 지원되는 훨씬 더 긴 암호 목록의 하위 집합으로, 다음 기준에 따라 선택 및 정렬되었습니다.

    1. 순방향 비밀성 지원

    2. 암호화 수준

    3. 속도

    4. 암호 패밀리 앞의 특정 암호

    5. 거부된 암호 앞의 허용된 암호

    순위가 높은 암호의 경우 이름에 ECDHE(Elliptic Curve Diffie-Hellman Ephemeral )가 있습니다. ephemeral(사용 후 삭제)은 순방향 비밀성을 나타냅니다. 또한 RC4는 현재 끝 부분에 있는 금지된 암호 중 하나입니다.

    내용이 표시되지 않는 기본값 또는 terse 명령 대신 명시적 암호 목록을 사용하는 것이 좋습니다.

    중요

    여기에 나와 있는 암호 목록은 가능한 여러 목록 중 하나에 불과합니다. 예를 들어, 순방향 비밀성 대신 속도를 기준으로 목록을 최적화할 수도 있습니다.

    이전 클라이언트를 지원해야 할 경우, DES-CBC3-SHA 암호 그룹을 허용할 수 있습니다.

    마지막으로 각 OpenSSL 업데이트 시 새 암호가 도입되고 이전 암호의 사용이 중단됩니다. EC2 Amazon Linux 인스턴스를 최신으로 유지하고, OpenSSL의 보안 알림을 잘 확인하며, 기술 정보 신문의 새 보안 취약점에 대한 보고를 잘 살핍니다. 자세한 내용은 Elastic Load Balancing 사용 설명서Predefined SSL Security Policies for Elastic Load Balancing 섹션을 참조하십시오.

    마지막으로 "#"을 제거하여 다음 줄의 주석 처리를 해제합니다.

    #SSLHonorCipherOrder on

    이 명령은 (이 예에서는) 순방향 비밀성을 지원하는 암호를 포함하여 서버에서 순위가 높은 암호를 선호하도록 합니다. 이 명령이 설정되면 서버는 먼저 강력한 보안 연결 설정을 시도해 본 후 보안이 더 약한 허용된 암호로 대체합니다.

  2. 사용되지 않는 프로토콜 지원: 구성은 운영 중단 경로에 있는 TLS 버전 1.0 및 1.1을 지원하기 때문에 2018년 6월 이후에는 TLS 버전 1.2를 권장합니다. 프로토콜 지원에 대해 향후 대비를 하기 위해 텍스트 편집기에서 /etc/httpd/conf.d/ssl.conf 구성 파일을 열고 각 줄의 시작 부분에 "#"을 입력하여 다음을 주석 처리합니다.

    #SSLProtocol all -SSLv3
    #SSLProxyProtocol all -SSLv3

    그런 다음, 다음 명령을 추가합니다.

    Copy
    SSLProtocol -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 +TLSv1.2 SSLProxyProtocol -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 +TLSv1.2

    이러한 명령은 SSL 버전 2 및 3과 TLS 버전 1.0 및 1.1을 명시적으로 비활성화합니다. 서버는 이제 TLS의 사용되는 버전을 제외한 다른 것을 사용하는 클라이언트와의 암호화된 연결을 허용하기를 거부합니다. 명령의 상세 내용은 서버의 구성 내용을 사람에게 더욱 명확히 전달합니다.

    참고

    이러한 방식으로 TLS 버전 1.0 및 1.1을 비활성화하면 적은 비율의 오래된 웹 브라우저가 사이트에 액세스하지 못하도록 차단합니다.

편집한 구성 파일에 이러한 변경 사항을 저장한 후 Apache를 다시 시작합니다.

Qualys SSL Labs에서 도메인을 다시 테스트하려면 RC4 취약성이 해결되고 요약이 다음과 같아야 합니다.

종합 등급 A
인증서 100%
프로토콜 지원 100%
키 교환 90%
암호화 수준 90%

문제 해결

  • 암호를 입력하지 않으면 Apache 웹 서버가 시작하지 않습니다.

    암호화되고 암호로 보호되는 프라이빗 서버 키를 설치한 경우 이는 예상된 동작입니다.

    키에서 암호화 및 암호를 제거할 수 있습니다. 기본 디렉터리에 custom.key라는 암호화된 프라이빗 RSA 키가 있고 이 키의 암호가 abcde12345라고 가정하면, EC2 인스턴스에서 다음 명령을 실행하여 이 키의 암호화되지 않은 버전을 생성합니다.

    Copy
    [ec2-user ~]$ cd /etc/pki/tls/private/ [ec2-user private]$ sudo cp custom.key custom.key.bak [ec2-user private]$ sudo openssl rsa -in custom.key -passin pass:abcde12345 -out custom.key.nocrypt [ec2-user private]$ sudo mv custom.key.nocrypt custom.key [ec2-user private]$ sudo chown root.root custom.key [ec2-user private]$ sudo chmod 600 custom.key [ec2-user private]$ sudo service httpd restart

    이제 Apache가 암호를 묻지 않고 시작할 것입니다.

부록: Amazon Linux에서 Certbot의 Let's Encrypt

Let's Encrypt 인증 기관은 전체 인터넷을 암호화하기 위한 EFF(Electronic Frontier Foundation) 작업의 중요한 부분입니다. 그 목표에 따라, Let's Encrypt 호스트 인증서는 사용자의 개입을 최소화하면서 생성, 검증, 설치 및 유지되도록 설계되었습니다. 인증서 관리의 자동화된 측면은 웹 서버에서 실행되는 에이전트에 의해 수행됩니다. 에이전트를 설치 및 구성한 후 Let's Encrypt와 안전하게 통신하고 Apache 및 키 관리 시스템에서 관리 작업을 수행합니다. 본 자습서에서는 사용자 지정된 암호화 키를 인증서의 기반으로 공급할 수 있거나 에이전트 자체가 기본값에 따라 키를 생성할 수 있기 때문에 무료 Certbot 에이전트를 사용합니다. 또한 Certbot이 아래 자동화된 인증서 갱신 구성에서 설명한 대로 사용자의 상호 작용 없이 정기적으로 인증서를 갱신하도록 구성할 수 있습니다. 자세한 내용은 Certbot 사용 설명서 또는 맨 페이지를 참조하십시오.

중요

Certbot 개발자들은 Amazon Linux의 Certbot 지원이 실험 단계라고 경고합니다. 문제가 발생하는 경우 손쉽게 복구할 수 있도록 Certbot을 설치하기 전에 EBS 루트 볼륨의 스냅샷을 만드는 것이 좋습니다. EBS 스냅샷에 대한 자세한 내용은 Amazon EBS 스냅샷 생성을 참조하십시오.

Certbot 설치 및 실행

Certbot은 Amazon Linux에서 공식적으로 지원되지 않고 Amazon Linux 패키지 리포지토리에서 사용할 수 없지만 설치하면 제대로 작동합니다. 이 지침은 RHEL 6에 Certbot 설치에 대한 EFF의 문서를 기반으로 합니다.

이 절차는 Certbot의 기본 사용 및 결과로 얻은 2048비트 RSA 키에 기반을 둔 인증서에 대해 설명합니다. 사용자 지정 키를 실험하려면 Let's Encrypt에 ECDSA 인증서 사용부터 시작할 수 있습니다.

  1. 인스턴스의 Fedora 프로젝트로부터 EPEL(Extra Packages for Enterprise Linux) 리포지토리를 활성화합니다. EPEL의 패키지는 Certbot 설치 스크립트를 실행할 때 종속성으로 필요합니다.

    Copy
    [ec2-user ~]$ sudo yum-config-manager --enable epel
  2. 다음 명령을 사용하여 EFF에서 EC2 인스턴스에 Certbot 최신 릴리스를 다운로드합니다.

    Copy
    [ec2-user ~]$ wget https://dl.eff.org/certbot-auto
  3. 다운로드한 파일을 실행 파일로 만듭니다.

    Copy
    [ec2-user ~]$ chmod a+x certbot-auto
  4. 루트 권한 및--debug 플래그로 파일을 실행합니다.

    Copy
    [ec2-user ~]$ sudo ./certbot-auto --debug
  5. "Is this ok [y/d/N]," 프롬프트에서 "y"를 입력하고 Enter 키를 누릅니다.

  6. "Enter email address (used for urgent renewal and security notices)," 프롬프트에서 연락처 주소를 입력하고 Enter 키를 누릅니다.

  7. 프롬프트에서 Let's Encrypt 서비스 계약 조건에 동의합니다. 진행하려면 "A"를 입력하고 Enter 키를 누릅니다.

    -------------------------------------------------------------------------------
    Please read the Terms of Service at
    https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf. You must agree
    in order to register with the ACME server at
    https://acme-v01.api.letsencrypt.org/directory
    -------------------------------------------------------------------------------
    (A)gree/(C)ancel: A
  8. EFF 권한 부여를 클릭하면 "Y" 또는 "N"를 입력하여 메일 발송 목록에 포함되고 Enter 키를 누릅니다.

  9. 아래에 표시된 프롬프트에서 일반 이름(위에서 설명한 도메인의 이름) 및 주체 대체 이름(SAN)을 입력하고 스페이스 또는 쉼표로 두 개의 이름을 분리합니다. 그런 다음 Enter 키를 누릅니다. 이 예제에서는 이름이 제공되었습니다.

    No names were found in your configuration files. Please enter in your domain
    name(s) (comma and/or space separated)  (Enter 'c' to cancel):example.com www.example.com
  10. 기본 Apache 구성의 Amazon Linux 시스템에서는 아래 예제와 유사한 제공한 첫 번째 이름에 대해 묻는 출력이 표시됩니다. "1"을 입력하고 Enter 키를 누릅니다.

    Obtaining a new certificate
    Performing the following challenges:
    tls-sni-01 challenge for example.com
    tls-sni-01 challenge for www.example.com
    
    We were unable to find a vhost with a ServerName or Address of example.com.
    Which virtual host would you like to choose?
    (note: conf files with multiple vhosts are not yet supported)
    -------------------------------------------------------------------------------
    1: ssl.conf                       |                       | HTTPS | Enabled
    -------------------------------------------------------------------------------
    Press 1 [enter] to confirm the selection (press 'c' to cancel): 1
  11. 다음으로 Certbot은 두 번째 이름을 묻습니다. "1"을 입력하고 Enter 키를 누릅니다.

    We were unable to find a vhost with a ServerName or Address of www.example.com.
    Which virtual host would you like to choose?
    (note: conf files with multiple vhosts are not yet supported)
    -------------------------------------------------------------------------------
    1: ssl.conf                       |                       | HTTPS | Enabled
    -------------------------------------------------------------------------------
    Press 1 [enter] to confirm the selection (press 'c' to cancel): 1

    이 시점에서 Certbot이 키와 CSR을 생성합니다.

    Waiting for verification...
    Cleaning up challenges
    Generating key (2048 bits): /etc/letsencrypt/keys/0000_key-certbot.pem
    Creating CSR: /etc/letsencrypt/csr/0000_csr-certbot.pem
  12. 생성할 Certbot 및 필요한 모든 호스트 인증서를 승인합니다. 각 이름을 묻는 메시지가 표시되면 예제에 나와 있는 것과 같이 "1"을 입력하고 Enter 키를 누릅니다.

    We were unable to find a vhost with a ServerName or Address of example.com.
    Which virtual host would you like to choose?
    (note: conf files with multiple vhosts are not yet supported)
    -------------------------------------------------------------------------------
    1: ssl.conf                       |                       | HTTPS | Enabled
    -------------------------------------------------------------------------------
    Press 1 [enter] to confirm the selection (press 'c' to cancel): 1
    Deploying Certificate for example.com to VirtualHost /etc/httpd/conf.d/ssl.conf
    
    We were unable to find a vhost with a ServerName or Address of www.example.com.
    Which virtual host would you like to choose?
    (note: conf files with multiple vhosts are not yet supported)
    -------------------------------------------------------------------------------
    1: ssl.conf                       | example.com        | HTTPS | Enabled
    -------------------------------------------------------------------------------
    Press 1 [enter] to confirm the selection (press 'c' to cancel): 1
    Deploying Certificate for www.example.com to VirtualHost /etc/httpd/conf.d/ssl.conf
  13. 웹 서버에 보안성이 낮은 연결을 허용할지를 선택합니다. 예제에 나와 있는 것과 같이 옵션 2를 선택하면 모든 서버 연결이 암호화되거나 거부됩니다.

    Please choose whether HTTPS access is required or optional. 
    -------------------------------------------------------------------------------
    1: Easy - Allow both HTTP and HTTPS access to these sites
    2: Secure - Make all requests redirect to secure HTTPS access
    -------------------------------------------------------------------------------
    Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2

    Certbot은 Apache의 구성을 완료하고 성공 및 기타 정보를 보고합니다.

    Congratulations! You have successfully enabled https://example.com and
    https://www.example.com
    
    You should test your configuration at:
    https://www.ssllabs.com/ssltest/analyze.html?d=example.com
    https://www.ssllabs.com/ssltest/analyze.html?d=www.example.com
    -------------------------------------------------------------------------------
    
    IMPORTANT NOTES:
     - Congratulations! Your certificate and chain have been saved at
       /etc/letsencrypt/live/example.com/fullchain.pem. Your cert will
       expire on 2017-07-19. To obtain a new or tweaked version of this
       certificate in the future, simply run certbot-auto again with the
       "certonly" option. To non-interactively renew *all* of your
       certificates, run "certbot-auto renew"
    ....
  14. 설치를 완료한 후 3단계: 보안 구성 테스트 및 강화에서 설명한 대로 서버의 보안을 테스트 및 최적화합니다.

자동화된 인증서 갱신 구성

Certbot은 서버 시스템의 표시되지 않고 오류를 방지하는 부분이 되도록 설계되었습니다. 기본적으로 만료 시간이 90일로 짧은 호스트 인증서를 생성합니다. 이전에 시스템이 자동으로 명령을 호출하도록 허용하지 않은 경우 만료 전에 certbot 명령을 수동으로 다시 실행합니다. 이 절차는 cron 작업을 설정하여 Certbot을 자동화하는 방법을 보여줍니다.

  1. Certbot을 처음으로 성공적으로 실행한 후 텍스트 편집기에서 /etc/crontab을 열고 다음과 유사한 줄을 추가합니다.

    39      1,13    *       *       *       root    /home/ec2-user/certbot-auto renew --no-self-upgrade

    다음은 각 구성에 대한 설명입니다.

    39 2,14 * * *

    명령이 매일 02:39와 14:39에 실행되도록 예약합니다. 선택한 값은 임의이지만 Certbot 개발자는 명령을 매일 두 번 실행하는 것을 제안합니다.

    root

    명령은 루트 권한으로 실행됩니다.

    /home/ec2-user/certbot-auto renew --no-self-upgrade

    실행할 명령입니다. /home/ec2-user/ 경로는 기본 사용자 홈 디렉터리에 Certbot을 설치했다고 가정합니다. 필요에 따라 이를 조정합니다. renew 하위 명령을 사용하면 Certbot이 이전에 얻은 모든 인증서가 점검하고 만료 날짜가 다가오고 있는 인증서를 갱신합니다. --no-self-upgrade 플래그를 사용하면 Certbot이 사용자의 개입 없이 자체 업그레이드하지 않습니다.

    작업을 마치면 파일을 저장합니다.

  2. cron 데몬을 다시 시작합니다.

    Copy
    [ec2-user ~]$ sudo service crond restart