클라우드 네이티브 애플리케이션 부트캠프 알림

티스토리 뷰

Security

암호화와 전자서명에 대한 이해

Happy@Cloud 2020. 6. 17. 14:03

암호화와 전자서명 모두 통신 중 해킹을 방지하기 위한 솔루션입니다.
메일, 파일, 메시지 등 데이터를 안전하게 송/수신하기 위해 고안되었습니다.
 

암호화란 ?

수신자의 공개키로 데이터를 암호화하는것을 의미합니다. 수신자는 자신의 개인키가 있어야 그 데이터를 해독할 수 있습니다.
예를 들어 설명하면 ...
100명의 직원이 있는 회사에 암호화 메일로 안전하게 통신하고 싶다고 아래와 같이 하면 됩니다.
- 100명 각각의 개인키와 공개키를 만듭니다.
- 메일 송부 프로그램은 각 수신자의 공개키로 메일 내용을 암호화 합니다.
- 메일 조회 프로그램은 현재 수신자의 개인키로 메일 내용을 복호화하여 표시합니다.
 

전자서명이란?

전자서명은 데이터에 발신자의 개인키로 서명을 추가하는 것입니다.
전자서명은 본문 내용이 네트워크 구간에서 조작되지 않았다는 것을 검증하기 위해 사용됩니다.
수신자는 발신자의 공용키로 데이터가 조작되지 않았는지를 검증할 수 있습니다.
위 메일의 예를 들어 설명하면...
- 메일 송부 프로그램은 발신자의 개인키로 본문 내용에 전자서명 데이터를 추가합니다.
- 메일 조회 프로그램은 복호화 하기 전에 발신자의 공용키로 전자서명을 해독하여 본문 내용이 조작되지 않았는지 검증합니다.
 

응용하기

1) S/W 위변조 검증
원격지 S/W저장소(예: docker hub, rpm package 저장소 등)의 S/W가 위변조되지 않았다는것을 검증하기 위해서 사용됩니다.
원격저장소의 S/W를 repository의 Private key로 전자서명합니다. 
프로그램 설치하는 사람은 repository의 public key(보통 이것을 gpg key라고 함)를 공개key저장소나 별도의 루트로 받습니다. 프로그램 다운로드 후 설치 시에 설치 프로그램(예: yum)은 파일이 위변조 되지 않았는지 공개key로 검증합니다.
 
2) ssh 접근 허용
ssh로 접근하려는 소스단말기는 private key를 갖고 있고, 대상 서버는 그 private key를 해독할 public key가 있어야 합니다.
대상 서버는 소스단말기가 전송한 private key를 ~/.ssh/authorized_keys파일에 있는 public key로 복호화하여 유효한 경우 접근을 허용합니다.
이때 private key는 대상서버에서 발행한 key가 아니어도 됩니다.
오히려 아래와 같은 예제라면 Gateway에서 private/public key를 발급하고, public key를 Server A, B, C로 복사하는게 편합니다.

ssh key 발급은 ssh-keygen명령을 이용하면 되고, public key 복사는 ssh-copy-id 명령을 이용하면 됩니다.
아래 예제를 참고하세요.
gateway서버에서 key를 생성합니다.
-t는 type, -b는 bit를 의미합니다. id_rsa_gateway파일이 private key이고, id_rsa_gateway.pub파일이 public key입니다.

[root@study ~]# ssh-keygen -t rsa -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): /root/.ssh/id_rsa_gateway
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa_gateway.
Your public key has been saved in /root/.ssh/id_rsa_gateway.pub.
The key fingerprint is:
SHA256:ypJ98h+Z9yS5qo2Eb3ALFmPKiBlZ7lZiYppv7Ozn1Kc root@study.ocean.ibm.com
The key's randomart image is:
+---[RSA 4096]----+
|                 |
|  .              |
| +               |
|+.+ . +          |
|oO = o oS        |
|= + o=+o.  o .   |
| +  +.B++.+ + .  |
| .+... Ooo o =   |
| ++o. E.=o+.. .  |
+----[SHA256]-----+
[root@study ~]# ls -al /root/.ssh/
total 32
drwx------. 2 root root 4096 Jun 26 01:11 .
dr-xr-x---. 3 root root 4096 Jun 24 02:50 ..
-rw-------. 1 root root 1491 Jun 26 00:38 authorized_keys
-rw-------. 1 root root 3243 Jun 24 02:49 id_rsa
-rw-------. 1 root root 3243 Jun 26 01:11 id_rsa_gateway
-rw-r--r--. 1 root root  750 Jun 26 01:11 id_rsa_gateway.pub
-rw-r--r--. 1 root root  743 Jun 24 02:49 id_rsa.pub
-rw-r--r--. 1 root root  196 Jun 24 02:50 known_hosts

 
이제 server A, B, C에 public key를 복사합니다.

cd ~/.ssh
ssh-copy-id -i ./id_rsa_gateway.pub <target userid>@<target server IP or hostname>

target server의 <USER HOME>/.ssh디렉토리의 authorized_keys파일에 추가됩니다.
아래는 study.ocean.ibm.com서버의 ocean 유저와 bastion.ibm.cloud서버의 root유저에 대한 public key파일이 추가된 예입니다.

 
Gateway서버의 ~/.ssh디렉토리에 config라는 파일을 만들고, 아래 예제 처럼 각 서버의 이름(적절하게 부여), IP, userid, private key file(gateway서버의 private key file 경로)를 지정하십시오.

Host gateway
    HostName 172.168.0.187
    Port 22
    User root
    IdentityFile ~/.ssh/id_rsa
Host network
    HostName 172.168.0.189
    Port 22
    User root
    IdentityFile ~/.ssh/id_rsa

gateway서버에서 ssh {대상 server명}을 입력하면, 암호없이 대상 서버로 접근할 수 있습니다.
 
 
 
 
 

댓글

클라우드 네이티브 애플리케이션 부트캠프 알림