암호화 및 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단계 과정
-
cipher suites 교환
cipher suites: tls에서 활용하는 보안 알고리즘들| ssl/tls버전, 지원하는 cipher suites 목록, 기타정보 | | client ---> server | | <--- | | ssl/tls버전, 선택한 cipher suites, 인증서, 기타정보 |
-
인증서 믿을수 있는 인증 기관(Certificate authority)에서 배포하는 서버 신원에 대한 검증 확인
-
키교환
-
통신
- 평문(Plaintext): 암호화 전의 원본 데이터.
- 암호문(Ciphertext): 암호화된 데이터로, 원본 데이터에서 변환된 형태입니다.
- 복호화(Decryption): 암호문을 다시 평문으로 변환하는 과정입니다.
- 키(Key): 암호화 및 복호화 과정에서 사용되는 핵심 정보입니다.
- 암호 알고리즘: AES, DES와 같은 암호화 및 복호화에 사용되는 알고리즘입니다.
SSL/TLS란?
SSL/TLS는 클라이언트와 서버 간의 데이터 무결성 및 기밀성을 보장하는 보안 프로토콜입니다. 주로 HTTPS를 통해 웹에서 사용되며, 데이터를 암호화하여 중간에서 탈취되더라도 안전하게 보호합니다.
SSL/TLS의 동작 원리
- Cipher Suites 교환: 클라이언트와 서버는 사용할 암호화 알고리즘(Cipher Suites)을 협상합니다.
- 서버 인증서 검증: 서버는 인증 기관(Certificate Authority)에서 발급받은 인증서를 클라이언트에 전송하며, 클라이언트는 이를 검증합니다.
- 키 교환: 안전한 통신을 위해 세션 키(Session Key)를 교환합니다.
- 암호화된 데이터 전송: 양측은 협상된 알고리즘과 키를 사용해 데이터를 암호화하여 전송합니다.
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>
여기서 SSLCertificateFile
과 SSLCertificateKeyFile
경로를 앞서 생성한 인증서와 개인 키의 경로로 설정합니다.
3. SSL 가상 호스트 활성화
이제 SSL 설정을 활성화합니다.
sudo a2ensite default-ssl.conf
4. Apache 재시작
모든 설정이 완료되었으면 Apache를 재시작합니다.
sudo systemctl restart apache2
- SSL/TLS 인증서 발급 과정 Let’s Encrypt를 이용한 무료 SSL 인증서 발급 과정: certbot 설치: apt-get update apt-get install certbot python3-certbot-apache
인증서 발급 명령:
certbot –apache -d www.example.com
도메인 소유권 확인 및 인증서 발급
- 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
- 주의사항 및 문제 해결 실제 소유한 도메인 사용 필수 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 설정 수정까지 전체적인 과정을 포함했습니다. 추가로 필요한 내용이 있다면 말씀해 주세요.