암호화 및 SSL/TLS

암호화: 수학적인 과정으로 어떤 정보를 읽을수 없는 데이터로 변환하는 행위
복원이 가능함 <-> hash 는 복원이 불가능

암호화의 종류

  • 암호화 기술을 사용하는 상황에 따라
    • 저장된 데이터보호(encryption at Rest)
    • 전송 중 데이터 보호 (Encryption At Transit)
  • 암호화 방법에 따라
    • 대칭키 암호화
    • 비대칭키 암호화

암호화 용어
평문(planetext): 암호화 하기 전의 데이터
암호문(CipherText): 평문을 암호화 알고리즘과 키를 적용하여 키를 소유한 주체가 아니면 알아볼 수 없는 암호문으로 만드는 과정
복호화(Decryption): 암호문에 키와 복호화 알고리즘을 적용하여 평문으로 되돌리는 과정
키(key): 평문을 암호화하거나 암호문을 평문으로 돌리기 위한 알고리즘에 핵심 가변정보 값
암호알고리즘: 암호화/복호화를 위해 사용되는 알고리즘(AES,DES등)

저장된 데이터 보호(Encryption at rest)

  • 데이터를 저장할 때 암호화하고 필요할 때 복호화 해서 사용하는 방식
  • 주로 하나의 물리적인 기기에 보안을 적용하기 위해 사용(예: 기기를 탈취 당했을 때 데이터의 보호)
  • 주로 키 파일 혹은 암호를 사용하여 암호화/복호화

전송 중 데이터 보호(ENcryption at transit)

  • 데이터의 전송 중 암호화를 적용하여 데이터가 탈취 당하지 않도록 보호
  • 주로 여러 시스템/기기 간에 보안을 적용하기 위해 사용(예: SSH/TLS,HTTPS등)

대칭키 암호화(Symmetric Encryption)

비대칭키 암호화(Asymmetric Encryption)

  • 한 쌍의 키를 활용한 암호화, 단 하나의 암호는 암호화만 가능하며, 다른 하나는 복호화만 가능
  • 연산이 비교적 복잡하지만 키 전달이 쉬움
  • 공개 키/ 비밀 키: 각각 암호화 복호화만 할 수 있는 키쌍
    • 공개키로 암호화하면 비밀 키로 복호화 <-> 비밀키로 암호화하면 공개 키로 복호화 가능

암호화 서명

  • 키를 사용해서 데이터의 생성자가 데이터를 생성 했음을 보장하는 방법
    • private 키를 사용하여 public 키로 검증 가능한 데이터의 서명을 생성
    • private 키를 가진 주체가 데이터를 생성했음을 보장할 수 있는 방법

SSL/TLS

  • 클라이언트와 서버간에 데이터의 무결성과 기밀성을 보장할 수 있는 프로토콜
    • 상호간의 통신은 암호화 되어 전달되며 중간에서 데이터를 탈취당해도 안전함
  • https 등 다양한 프로토콜에 활용
    • 즉 일반 http의 경우 연결이 안전하지 않기 때문에 보안적으로 취약함

3단계 과정

  1. cipher suites 교환
    cipher suites: tls에서 활용하는 보안 알고리즘들

    | ssl/tls버전, 지원하는 cipher suites 목록, 기타정보   |
    |             client ---> server                     |
    |                     <---                       |
    | ssl/tls버전, 선택한 cipher suites, 인증서, 기타정보  |
    
  2. 인증서 믿을수 있는 인증 기관(Certificate authority)에서 배포하는 서버 신원에 대한 검증 확인

  3. 키교환

  4. 통신

  • 평문(Plaintext): 암호화 전의 원본 데이터.
  • 암호문(Ciphertext): 암호화된 데이터로, 원본 데이터에서 변환된 형태입니다.
  • 복호화(Decryption): 암호문을 다시 평문으로 변환하는 과정입니다.
  • 키(Key): 암호화 및 복호화 과정에서 사용되는 핵심 정보입니다.
  • 암호 알고리즘: AES, DES와 같은 암호화 및 복호화에 사용되는 알고리즘입니다.

SSL/TLS란?

SSL/TLS는 클라이언트와 서버 간의 데이터 무결성 및 기밀성을 보장하는 보안 프로토콜입니다. 주로 HTTPS를 통해 웹에서 사용되며, 데이터를 암호화하여 중간에서 탈취되더라도 안전하게 보호합니다.

SSL/TLS의 동작 원리

  1. Cipher Suites 교환: 클라이언트와 서버는 사용할 암호화 알고리즘(Cipher Suites)을 협상합니다.
  2. 서버 인증서 검증: 서버는 인증 기관(Certificate Authority)에서 발급받은 인증서를 클라이언트에 전송하며, 클라이언트는 이를 검증합니다.
  3. 키 교환: 안전한 통신을 위해 세션 키(Session Key)를 교환합니다.
  4. 암호화된 데이터 전송: 양측은 협상된 알고리즘과 키를 사용해 데이터를 암호화하여 전송합니다.

SSL/TLS는 이러한 과정들을 통해 클라이언트와 서버 간의 안전한 통신을 보장합니다.


SSL/TLS에 대한 이론은 이해하기 쉬운 개념이지만, 실제로 이를 적용하는 것은 다소 복잡할 수 있습니다. 아래는 SSL/TLS를 웹 서버에 적용하는 예제입니다. 이 예제는 Apache 웹 서버를 기준으로 설명하겠습니다.

SSL/TLS 적용 예제 (Apache 웹 서버)

1. SSL 인증서 생성

먼저, 서버에 사용할 SSL 인증서를 생성해야 합니다. 테스트 목적으로 자체 서명된 인증서를 생성할 수 있습니다. 실제 환경에서는 신뢰할 수 있는 인증 기관(CA)에서 인증서를 발급받아야 합니다.

# OpenSSL을 사용하여 개인 키(Private Key) 생성
openssl genrsa -out myserver.key 2048

# CSR(Certificate Signing Request) 생성
openssl req -new -key myserver.key -out myserver.csr

# 자체 서명된 인증서 생성 (유효기간 365일)
openssl x509 -req -days 365 -in myserver.csr -signkey myserver.key -out myserver.crt

여기서 myserver.key는 개인 키 파일, myserver.csr은 인증서 서명 요청 파일, myserver.crt는 최종 인증서 파일입니다.

2. Apache 설정 파일 수정

다음으로 Apache 설정 파일을 수정하여 SSL을 활성화합니다.

  • SSL 모듈을 활성화합니다 (이 단계는 Debian/Ubuntu 기반 시스템에 해당합니다).

    sudo a2enmod ssl
    
  • 가상 호스트 파일을 수정하여 SSL을 활성화합니다. 보통 /etc/apache2/sites-available/ 디렉토리에서 설정 파일을 찾을 수 있습니다.

    sudo nano /etc/apache2/sites-available/default-ssl.conf
    
  • 다음과 같이 수정합니다.

    <VirtualHost *:443>
        ServerAdmin webmaster@localhost
        ServerName www.example.com
    
        DocumentRoot /var/www/html
    
        SSLEngine on
        SSLCertificateFile      /path/to/myserver.crt
        SSLCertificateKeyFile   /path/to/myserver.key
    
        <FilesMatch "\.(cgi|shtml|phtml|php)$">
                SSLOptions +StdEnvVars
        </FilesMatch>
        <Directory /usr/lib/cgi-bin>
                SSLOptions +StdEnvVars
        </Directory>
    
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined
    
    </VirtualHost>
    

여기서 SSLCertificateFileSSLCertificateKeyFile 경로를 앞서 생성한 인증서와 개인 키의 경로로 설정합니다.

3. SSL 가상 호스트 활성화

이제 SSL 설정을 활성화합니다.

sudo a2ensite default-ssl.conf

4. Apache 재시작

모든 설정이 완료되었으면 Apache를 재시작합니다.

sudo systemctl restart apache2
  1. SSL/TLS 인증서 발급 과정 Let’s Encrypt를 이용한 무료 SSL 인증서 발급 과정: certbot 설치: apt-get update apt-get install certbot python3-certbot-apache

인증서 발급 명령:

certbot –apache -d www.example.com

도메인 소유권 확인 및 인증서 발급

  1. Apache 설정 수동 수정 (필요시) SSL 모듈 활성화: text a2enmod ssl

가상 호스트 설정 수정:

vi /etc/apache2/sites-available/default-ssl.conf

설정 파일 내용:

<VirtualHost *:443> ServerName www.example.com DocumentRoot /var/www/html

SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/www.example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/www.example.com/privkey.pem

</VirtualHost>

Apache 재시작: text systemctl restart apache2

  1. 주의사항 및 문제 해결 실제 소유한 도메인 사용 필수 DNS 설정 확인 Let’s Encrypt 정책 준수 발생 가능한 오류 로그에서 볼 수 있는 오류 메시지: text Error creating new order :: Cannot issue for “www.example.com”: The ACME server refuses to issue a certificate for this domain name, because it is forbidden by policy

이 오류의 주요 원인: 예약된 도메인 사용 (예: example.com) 도메인 소유권 증명 실패 Let’s Encrypt 정책 위반 해결 방법: 실제 소유한 도메인으로 시도 DNS 설정 확인 Let’s Encrypt 정책 검토 이렇게 암호화 기초부터 SSL/TLS 인증서 발급, Apache 설정 수정까지 전체적인 과정을 포함했습니다. 추가로 필요한 내용이 있다면 말씀해 주세요.