[목차]
1. 메시지 인증 코드 (이론)
2. 윈도우에서 putty로 리눅스 접속 실습
3. openssl CMD로 키 생성 및 파일 암복호화 실습
4. SSH(Secure Shell) protocols
5. SSH 통신 과정 패킷 분석
6. SSH Debug Mode 설정 및 로그 분석
[메시지 인증 코드]
메시지 인증 코드(message authentication code)란,
무결성을 확인하고, 메세지에 대한 인증을 위한 코드
첫 글자를 따서 MAC이라 한다.
입력: 메세지, 공유하는 키
출력: 고정 비트 길이의 코드
* 일방향 해시와 메시지 인증 코드
일방향 해시: 키를 사용하지 않는다.
메시지 인증 코드: 키를 사용
메시지 인증 코드 이용 순서
① 앨리스와 수신자 A은행: 사전에 키(K) 공유
② 앨리스: 송금 의뢰 메시지(M) 작성 MAC 값(MACk(M))을 계산
③ 앨리스: 수신자 A은행으로 송금 의뢰 메시지와 MAC값을 전송
④ 수신자 A은행: 수신한 송금 의뢰 메시지를 기초로 해서 MAC 값을 계산
⑤ 수신자 A은행: 앨리스로부터 수신한 MAC값과 자신이 계산한 MAC값을 비교
⑥ 수신자 A은행:
* 인증 성공: 2개의 MAC값이 동일하면 송금 의뢰가 틀림없이 앨리스로부터 온것이라고 판단
* 인증 실패: 2개의 MAC값이 동일하지 않으면, 앨리스로부터 온것이 아니라고 판단
메세지 인증 코드 사용 예
1. SWIFT
국제 은행간 통신 협회(SWIFT)
SWIFT(Society for Woldwide Internet Financial Telecommunication)
은행과 은행은 SWIFT를 통해서 거래 메시지 교환
메시지 인증 코드를 사용
2. IPsec
인터넷 기반의 통신 프로토콜인 IP(Internet Protocol)에 보안을 첨가한 것
통신 내용 인증과 무결성을 위해 메시지 인증 코드를 이용
3. SSL/TLS
웹에서 온라인 쇼핑을 할 때 사용되는 통신 프로토콜
통신 내용의 인증과 무결성 확인을 위해 메시지 인증 코드를 이용
메시지 인증 코드 실현 방법
1. 일방향 해시 함수를 이용한 실현
SHA-1 또는 MD5와 같은 일방향 해시 함수를 이용하여
메시지 인증 코드를 실현 / HMAC
2. 블록 암호를 이용한 실현
TDES 또는 AES와 같은 블록 암호를 사용해서 메시지 인증 코드를 실현
블록 암호 키를 메시지 인증 코드의 공유키로 사용
CBC 모드로 메시지 전체를 암호화
메시지 인증 코드에서 복호화를 할 필요가 없으므로 최종 블록 이외는 폐기
최종 블록을 MAC 값으로 이용
3. 그 밖의 방법으로 실현
스트림 암호
공개 키 암호
인증 암호
인증 암호(Authentication Encryption)
AEAD(Authentication Encryption & Authentication Decryption)
2000년 이후 연구 진행
대칭 암호와 메시지 인증 코드를 조합하여 기밀성, 무결성, 인증을 동시에 충족시키는 구조
Encrypt-then-MAC
Encrypt-and-MAC
MAC-then-Encrypt
인증 암호 종류
■ Encrypt-then-MAC
평문을 대칭 암호로 암호화한 후 암호문의 MAC 값을 계산
메시지 인증 코드 입력에 암호문을 부여
선택 암호문 공격을 막을 수 있다.
(예) IPsec
■ Encrypt-and-MAC
평문을 대칭 암호로 암호화하고, 그와는 별도로 평문의 MAC값을 얻는 방법
(예) SSH
■ MAC-then-Encrypt
미리 평문의 MAC 값을 얻고, 평문과 MAC 값 양쪽을 정리하여
칭 암호로 암호화하는 방법
(예) SSL
GCM & GMAC
■ GCM(Galois/Counter Mode)
인증 모드의 일종
AES와 같은 128비트 블록 암호를 CTR 모드로 이용하여
MAC 값을 얻기 위해 덧셈과 곱셈을 반복하는 해시 함수를 사용
CTR 모드는 1씩 늘어가는 숫자를 암호화 하기 때문에
각 블록은 병렬 처리하여 실행 속도를 높일 수가 있음
CTR 모드와 MAC값 생성에 공통 키를 사용하기 때문에 키 관리도 편리
■ GMAC(Galois/Counter Mode MAC)
GCM을 메시지 인증 코드 전용으로 사용
제 09장 요점 정리 |
■ MAC versus Hash key 있는가? 없는가?
■ MAC의 키 배송 문제 공개키 암호 DH 키 교환(DHEK) 키 배포 센터 키를 안전한 방법으로 별도로 보내기
■ 메시지 인증 코드 알고리즘(Message Authentication Code Algorithms) HMAC(Hash-based MAC) : Hash + MAC CMAC(Cipher-based MAC) : Cipher + MAC(Block Cipher, Public Cipher) Poly1305 : Stream Cipher + MAC
■ 인증 암호(AEAD, AE) Encrypt-then-MAC Encrypt-and-MAC MAC-then-Encrypt |
[윈도우에서 PuTTY로 리눅스 서버 접속하기]
■ 사용시스템
linux200
win7
[참고] Use SSH Keys With PuTTY On Windows
https://devops.ionos.com/tutorials/use-ssh-keys-with-putty-on-windows/
[참고] Log in to a Linux server with an SSH private key on a Windows client
https://support.rackspace.com/how-to/log-into-a-linux-server-with-an-ssh-private-key-on-windows/
① putty 다운로드
https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html
putty-64bit-0.73-installer.msi
위의 사이트에서 PuTTY 다운로드 하고 설치한다.
* 특별한 옵션없이 기본 옵션으로 설치한다.
② PuTTYgen 실행하여 public/private 키 생성
Start > PuTTY(64-bit) > PuTTYgen
PuTTY Key Generator 실행되면 > Generate > (주의) 이때, 마우스를 계속 움직여야 한다.
Save public key 선택 > 바탕화면\id_rsa.txt
Save private key 선택 > 바탕화면\id_rsa.ppk
(주의) 암호(Key passphrase) 입력 또는 입력을 안한것에 대한 차이를 알아야 한다.
③ (linux200) public key를 서버에 복사
win7 바탕화면에 id_rsa.txt 파일의 내용을 복사하여
linux200 서버에 ~root/.ssh/authorized_keys에 추가
다음은 linux200 서버에 ~root/.ssh/authorized_keys 파일의 내용 예
# vi authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAkUf4TSdIwAQMv+xFXEORK96KzTBqYgFKb58ag+d23Z1yKfjWHifRzR3ByAaf24ZmNTvRm/ifLCTK+/jAOSan9Q4aZPd7TkzBZL66c8kfd61+WBIFkALxRMBYjZHl8WxjLKrBQH4JrhaGVKYy9MbzR83U0NNd+3RKQ/YH+AgWLXvRWaHcDXJeY8yC2BrNABApdEi1e/7qX8Un6zyj8+JJrEASh1hyqwid5mieIMTdIhdUW8ZlSWAtqED0N1/tItbRMO1+8E3/nkx9dXxDN5zXd+7TmyjILfdccd0+ZCQ/++cnHp5jJ2AHcUJRy40uIljqYLMx73IroXkfpaKtXIM8KQ== rsa-key-20200220 |
# chmod 600 authorized_keys
#
④ (win7) linux200 서버에 PuTTY 사용하여 접속
PuTTY Configuration > Session > Host Name : 192.168.10.200
PuTTY Configuration > Category: > Connection > SSH > Auth
> Private key file for authentication : "id_rsa.ppk 파일 선택"
> Open
[참고] Chrome의 Secure Shell App 사용하여 SSH 서버 접속하기 |
■ 사용시스템 win7 linux200
① 크롬 브라우저 설치 및 실행
② 구글 검색 및 앱 설치/실행
Google Search : 크롬 Secure Shell App
다음 사이트에 접속하여 Secure Shell App 설치한다.
홈 > 앱 > Secure Shell App > 앱 실행
③ 다음과 같은 정보를 입력
입력: root@리눅스ip > [ENTER] 연결 > 사용자 암호 입력
④ 여러가지 명령어 사용해 보기 |
[openssl CMD로 키 생성 및 파일 암복호화 실습]
■ 사용 시스템
kali
SSH(OpenSSH) <-------- SSL(OpenSSL)
* ssh-keygen CMD * openssl CMD
■ ssh-keygen CMD vesus openssl genrsa CMD
ssh-keygen CMD |
openssl genrsa|rsa CMD |
# ssh-keygen -t rsa -> private key -> public key
|
# openssl genrsa ... -> private key # openssl rsa ... -> public key |
① (kali) RSA private Key 생성
RSA private key 생성
# openssl genrsa --help
# openssl genrsa -out private.pem 2048
RSA public key 생성
# openssl rsa --help
# openssl rsa -in private.pem -out public.pem -outform PEM -pubout
# cd
# openssl genrsa -out private.pem 2048
# cat private.pem
-----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEAs2RCjb2j8h/oBnaeEjcMvBNhKx8Fvy2/jhFVCAigUlZOKqIg zYyNZCwqidgmqHFJhfQSv6WQkwBBOXyAotYn2X05uB4L/lOaMGZ1tCfj4nH7sz2p QTg0p84b4Zyfbic5kLx0X1qQUx8naruQn5POoko+XQnwhYYOCCRlgrbSN8Lg0Epa zYD23y/E9hnuKr/t8fU57SxiJpSnS07Qzozz0e3vxKLfQ7NU2mUNFngWplJYzvfY ..... (중략) ..... DvZpLW9u3cQ3FSnA4K+g9mZqqx+xoKuKA9ApNv+yOJGM0kZOrDWBe7dHSDcOTaa2 N/v2RL43yyN5u3ngq8pic3aNdZe2S/qxw0jKY9/CNaMUvJxjVm+YlqT6q4vri5nA fpgu+wKBgQDbu9QnG+BItuzUzHTq8pm79P821b5w1z4TTwc/zcrbOwk1e6/hRwtF D13O8oXJ1FX/FjGH32ApmxM1wRm/ABE3oTw10qwfDSpI5C6jYR0JBHC8OmP2uoxd FnTf0Pp+iGY9vv6LTlVNkEu/abUQ1Cdkeqo/w5Aa/tUTBjHLu8jZ0Q== -----END RSA PRIVATE KEY----- |
② (kali) RSA public Key 생성(PEM 형식)
# openssl rsa -in private.pem -out public.pem -outform PEM -pubout
# cat public.pem
-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs2RCjb2j8h/oBnaeEjcM vBNhKx8Fvy2/jhFVCAigUlZOKqIgzYyNZCwqidgmqHFJhfQSv6WQkwBBOXyAotYn 2X05uB4L/lOaMGZ1tCfj4nH7sz2pQTg0p84b4Zyfbic5kLx0X1qQUx8naruQn5PO oko+XQnwhYYOCCRlgrbSN8Lg0EpazYD23y/E9hnuKr/t8fU57SxiJpSnS07Qzozz 0e3vxKLfQ7NU2mUNFngWplJYzvfYAa/8We2wIpf84FHwOTQ53WskDUWrea9NVtmA JkEKu0AqALi1E3nx0NkSN6eZizLSUzwyOb6Foc7WQ1Q8NNEW4Bx0oUbH8o0vPK7C rQIDAQAB -----END PUBLIC KEY----- |
③ (kali) 암호화 시킬 테스트 파일 생성
# cat << EOF > sample.sql
CREATE TABLE [Departments] (
[DepartmentId] INTEGER NOT NULL PRIMARY KEY,
[DepartmentName] NVARCHAR(50) NULL
);
INSERT INTO Departments VAULES(1, 'IT');
EOF
④ (kali) public key를 사용한 암호화 된 파일 생성
sample.sql -- encrypt --> sample.ssl
파일 암호화
# openssl rsautl -encrypt -inkey pub.pem -pubin -in input.txt -out output.enc
파일 복호화
# openssl rsautl -decrypt -inkey pri.pem -in input.enc -out outout.dec
# openssl rsautl -encrypt -inkey public.pem -pubin \
-in sample.sql -out sample.ssl
# cat sample.ssl (# strings sample.ssl)
��G�����"���U\bb�F�i�XT%�,��Y���gDE����Qq��_68�g�sI숎.��� a�-����Q$ ��ku�s�cR��n�����d�㧁㗉� 1/ǩ�&�Y������zgrDyԘ�L�b���^�߇U�gX�Ͱ�����]�u6����R2�HP�y�|�@�W��+����puZ�l���i������JW�4 |
# file sample.ssl
sample.ssl: data |
⑤ (kali) private key를 사용한 파일 복호화(sample.ssl -- decrypt --> sample.txt)
# openssl rsautl -decrypt -inkey private.pem \
-in sample.ssl -out sample.txt
# cat sample.txt
CREATE TABLE [Departments] ( [DepartmentId] INTEGER NOT NULL PRIMARY KEY, [DepartmentName] NVARCHAR(50) NULL ); INSERT INTO Departments VAULES(1, 'IT'); |
[SSH(Secure Shell) Protocols]
■ Recommend For Comment
RFC 4251
RFC 4250 - 4256
■ SSH Protocol Architecture
SSH protocol 3가지 구성 요소
SSH Transport Layer Protocol : 서버 인증, 비밀성, 무결성 제공
SSH Connection Protocol : 암호화된 터널을 여러 논리 채널로 다중화
(보안 쉘 세션,TCP 포트 전달/터널링 사용 가능
SSH User Authentication Protocol : 클라이언트-서버 사용자 인증 제공
1. SSH TLP(Transport Layer Protocol)
■ SSH TLP 다음과 같은 기능을 제공
사용자 데이터 암호화(encryption of user data)
서버 인증(server authentication (based on asymmetric host key/s))
무결성 제공(integrity protection (origin and data))
(optionally) 암호화 전에 압축 기능 제공(compression of data prior to encryption)
■ SSH TLP 사용되는 method
키 교환 방법(Key exchange method) (ex) ECDH(Elliptic Curve Diffie-Hellman)
공개 키 알고리즘(public key algorithm) (ex) ssh-ed25519
대칭 암호 알고리즘(symmetric encryption algorithm) (ex) aes128-ctr
MAC 알고리즘(message authentication algorithm) (ex) hmac-sha2-256
해시 알고리즘(hash algorithm) (ex) sha2-256
다음은 Encrypt & MAC/authenticate 과정이다.
■ MAC 만들기 (ex: hmac-sha2-256)
encoded_packet = packet_length || padding_length || payload || random_padding
mac = MAC(key, sequence_number || encoded_packet)
■ SSH TLP Diffie-Hellman Key Exchange (ex: Elliptic Curve Diffie-Hellman)
Vs = Server's strings
Vc = Client's strings
Ks = Server's public host key
Is = Server's SSH_MSG_KEXINIT msgs
Ic = Client's SSH_MSG_KEXINIT msgs
① 클라이언트는 random x 선택, e = gx mod p 계산, e 값을 서버로 보낸다.
② 서버는 random y 선택, f = gy mod p 계산, 서버는 클라이언트가 보낸 e 값을 받는다.
그리고 다음을 계산한다.
* K = ey mod p
* H = hash(Vc || Vs || Ic || Is || Ks || e || f || K)
private host key를 가지고 H의 signature s 만든다.
서버는 (Ks || f || s)를 클라이언트에게 전송한다.
/* Ks : Server's public host key, f = gy mod p, s = H의 signature */
③ 클라이언트는 Ks확인한다.(서버를 위한 host key가 정말 맞는지)
그리고 다음을 계산한다.
* K = fx mod p
* H = hash(Vc || Vs || Ic || Is || Ks || e || f || K)
클라이언트는 H의 signature s을 확인(verify)
■ SSH Session Key Derivation(세션 키 파생)
키 교환의 결과
클라이언트와 서버는 현재 master key K를 공유했다.
서버는 클라이언트를 인증했다.(서버는 클라이언트의 random DH public key로 sign 했다.)
이 연결에 대해, 해시값 H는 session ID 처럼 사용한다.
파생된 session key를 사용하여 후속 통신이 보호된다.
Session Key - IV(Init Vectors), EK(Encryption Keys), AK(Authentication Keys):
IVcs = hash(K || H || "A" || session_id)
IVsc = hash(K || H || "B" || session_id)
EKcs = hash(K || H || "C" || session_id)
EKsc = hash(K || H || "D" || session_id)
AKcs = hash(K || H || "E" || session_id)
AKss = hash(K || H || "F" || session_id)
키 데이터는 해시 출력의 처음 부분에서 가져온다.
생성된 키 값을 가지고 Encryption 진행한다.
2. SSH User Authentication Protocol
key exchange 이후에 클라이언트는 SSH_MSG_SERVICE_REQUEST 패킷을 보내서
(ㄱ) "User Authentication" 또는
(ㄴ) "Connection Protocol"을 요청한다.
User Authentication Method 3가지 제공(서버에서 설정)
Public key (required) => public key authentication
* 클라이언트는 session id, 사용자 이름, 사용자 public key 및
기타 정보를 포함하는 서명된 메시지를 서버에 보낸다.
서명은 사용자의 개인 키를 사용하여 생성된다.
* 메시지 수신시, 서버는 제공된 공개 키가 인증에 적합한 지 여부를 확인하고,
필요한 경우 서명이 올바른지 확인한다.
Password (Optional) => password-based authentication
* 클라이언트는 기본적으로 사용자 이름과 비밀번호를 명확하게 보낸다.
그러나 SSH 전송 보안 프로토콜로 보호된다.
Host-based (optional) => host-based authentication
* 위의 공개 키 방법과 유사하지만 호스트 별(사용별이 아님) 공개 키를 사용한다.
인증은 사용자가 온 호스트와 원격 호스트의 사용자 이름을 기반으로 한다.
(ex) /etc/shosts.equiv(/etc/hosts.equiv), $HOME/.shosts($HOME/.rhosts)
3. SSH Connection Protocol
SSH Connection Protocol 제공되는 기능
대화식 로그인 세션(Interactive login sessions)
(ex) # ssh user01@192.168.10.200
원격 명령 실행(Remote execution of commands)
(ex) # ssh 192.168.10.200 CMD
Forwarded TCP/IP Connections (Port forwarding)
(ex) Local Port Forwarding
(client) # ssh -L 1234:localhost:25 -N user@ssh-server
(ex) Remote Port Forwarding
(server) # ssh -R 1200:localhost:80 -N user@ssh-server
Forwarded X11 Connections (X11 Forwarding)
(ex) # ssh -X 192.168.10.200 (-X 상대방 서버에서 GUI를 사용할때)
이러한 앱은 암호화 된 터널로 다중화 된 채널로 구현된다. 터널은 SSH Transport Leyer Protocol에 의해 제공된다.
'정보보안공부 > 정보보안전문과정' 카테고리의 다른 글
정보보안 과정 Day92 : 디지털서명 / gpg / 인증서 / openssl / 암호학 종료 (내용무) (0) | 2021.01.18 |
---|---|
정보보안 과정 Day91: HMAC/CMAC/디지털서명 (0) | 2021.01.15 |
정보보안 과정 Day89 : NTLM 해시 크랙 / Yum repo 서명/검증 실습 / 해시 함수 테스트 (0) | 2021.01.13 |
정보보안 과정 Day88-1 : 해시 스크립트 제작 실습 / 암호크랙 실습 (0) | 2021.01.12 |
정보보안 과정 Day88 : 일방향 해시 함수(이론) (0) | 2021.01.12 |