[목차]

 

 

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 설치한다.

http://bit.thdev.net/Oxtug1

 

홈 > 앱 > 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 : 클라이언트-서버 사용자 인증 제공

 

 

 

[ 그림 ] SSH Protocol Stack(cisco.com)

 

 

 

 

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에 의해 제공된다.

 

 

 


 

 

 

 

 

728x90

+ Recent posts