EC2 SSH 동작원리 분석하기

GonnabeAlright·2022년 6월 23일
1
post-thumbnail

Terraform 명령어로 EC2 생성

생성된 EC2 정보

  • 퍼블릭 IPv4 주소: 52.79.236.180
  • 프라이빗 IPv4 주소: 172.31.47.65

SSH EC2 접속

ssh -v -i ~/.ssh/linux.pem -o IdentitiesOnly=yes ec2-user@52.79.236.180

EC2 Connect 로그 분석

서버에 원격 접속하기 위해 연결 프로세스 시작

OpenSSH_8.6p1, LibreSSL 3.3.6
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 21: include /etc/ssh/ssh_config.d/* matched no files
debug1: /etc/ssh/ssh_config line 54: Applying options for *
debug1: Authenticator provider $SSH_SK_PROVIDER did not resolve; disabling
debug1: Connecting to 52.79.236.180 [52.79.236.180] port 22.
debug1: Connection established.

SSH 프로토콜 버전 교환

debug1: identity file /Users/jinhyeokhong/.ssh/linux.pem type -1
debug1: identity file /Users/jinhyeokhong/.ssh/linux.pem-cert type -1
debug1: Local version string SSH-2.0-OpenSSH_8.6
debug1: Remote protocol version 2.0, remote software version OpenSSH_7.4
debug1: compat_banner: match: OpenSSH_7.4 pat OpenSSH_7.0*,OpenSSH_7.1*,OpenSSH_7.2*,OpenSSH_7.3*,OpenSSH_7.4*,OpenSSH_7.5*,OpenSSH_7.6*,OpenSSH_7.7* compat 0x04000002

  • SSH는 양측이 서로에게 버전 문자열을 보내는 것으로 시작됩니다. 핸드셰이크의 한 부분으로서 SSH 설계의 몇 가지 결함으로 인해 대부분의 최신 클라이언트와 서버는 SSH 2.0만 지원한다는 점에 유의해야 합니다.

키교환 과정(Elliptic Curve Diffie-Hellman 방식)

Elliptic Curve Diffie-Hellman Initialization

debug1: Authenticating to 52.79.236.180:22 as 'ec2-user'
debug1: load_hostkeys: fopen /Users/jinhyeokhong/.ssh/known_hosts2: No such file or directory
debug1: load_hostkeys: fopen /etc/ssh/ssh_known_hosts: No such file or directory
debug1: load_hostkeys: fopen /etc/ssh/ssh_known_hosts2: No such file or directory
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: algorithm: curve25519-sha256
debug1: kex: host key algorithm: ssh-ed25519

  • SSH 키 교환(KEX)은 양쪽에서 SSH_MSG_KEX_INIT 메시지를 서로에게 보내면서 시작됩니다. 이 메시지는 선호도를 반영하는 순서로 지원하는 암호화 기본 형식의 목록입니다.
  • 암호화 기본 요소는 키 교환을 수행한 다음 대량 데이터 암호화를 수행하는 데 사용할 빌딩 블록을 설정하는 것입니다.
  • 양측은 동일한 알고리즘을 사용하여 지원 목록에서 암호화 프리미티브를 선택하기 때문에 키 교환 초기화 후 키 교환을 즉시 시작할 수 있습니다. ECDH(Elliptic Curve Diffie-Hellman)으로 클라이언트가 임시 키 쌍(개인 및 관련 공개 키)을 생성하고 SSH2_MSG_KEXINIT 메시지로 서버에 공개 키를 보내는 것으로 키 교환이 시작됩니다.
Key Exchange(KEX)Symmetric CipherMessage Authentication Code(Mac)Server Host Key Algorithm
curve25519-sha256@libssh.orgchacha20-poly1305@openssh.comhmac-sha2-256-etm@openssh.comssh-rsa-cert-y01@openssh.com
ecdh-sha2-nistp256aes128-gcm@openssh.comhmac-sha2-256ssh-rsa
ecdh-sha2-nistp384aes256-ctr
ecdh-sha2-nistp521aes192-ctr
aes128-ctr

임시 키쌍 공유

debug1: kex: server->client cipher: chacha20-poly1305@openssh.com MAC: <implicit> compression: none
debug1: kex: client->server cipher: chacha20-poly1305@openssh.com MAC: <implicit> compression: none

  • 하지만 이 키 쌍은 임시적이며 키 교환 중에만 사용되며 나중에 폐기됩니다. 이러한 방식은 공격자가 미래의 언젠가 개인 키를 훔칠 기회를 엿보고 암호화된 트래픽을 수동적으로 기록하는 공격 클래스를 극도로 어렵게 만듭니다. 따라서 교환 중에 탈취당했다고 해도 키 교환 중에만 사용하고 폐기되는 키 쌍이기 때문에 무용지물이 됩니다. 이러한 속성을 순방향 비밀성이라고 합니다.

Elliptic Curve Diffie-Hellman Reply

debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
debug1: SSH2_MSG_KEX_ECDH_REPLY received
debug1: Server host key: ssh-ed25519 SHA256:FZWagooddK7helloNQgMI1y3FLJF6q+lvz/PNj1Ads
debug1: load_hostkeys: fopen /Users/jinhyeokhong/.ssh/known_hosts2: No such file or directory
debug1: load_hostkeys: fopen /etc/ssh/ssh_known_hosts: No such file or directory
debug1: load_hostkeys: fopen /etc/ssh/ssh_known_hosts2: No such file or directory
debug1: hostkeys_find_by_key_hostfile: hostkeys file /Users/jinhyeokhong/.ssh/known_hosts2 does not exist
debug1: hostkeys_find_by_key_hostfile: hostkeys file /etc/ssh/ssh_known_hosts does not exist
debug1: hostkeys_find_by_key_hostfile: hostkeys file /etc/ssh/ssh_known_hosts2 does not exist
The authenticity of host '52.79.236.180 (52.79.236.180)' can't be established.
ED25519 key fingerprint is SHA256:FZWaItntdK7wCjNJHELLOI1y3FLJF6q+lvz/Pgoods.
This key is not known by any other names

로컬 데이터베이스에 호스트 키 추가

Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '52.79.236.180' (ED25519) to the list of known hosts.

  • 로컬 데이터베이스에 호스트 키를 추가하도록 요청하는 SSH 클라이언트. OpenSSH의 경우 일반적으로 ~/.ssh/known_hosts입니다.

New keys

debug1: rekey out after 134217728 blocks
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: rekey in after 134217728 blocks
debug1: Will attempt key: /Users/jinhyeokhong/.ssh/linux.pem explicit
debug1: SSH2_MSG_EXT_INFO received
debug1: kex_input_ext_info: server-sig-algs=<rsa-sha2-256,rsa-sha2-512>
debug1: SSH2_MSG_SERVICE_ACCEPT received

  • 교환 해시는 다음 필드의 해시(키 교환 알고리즘에 따라 SHA256, SHA384 또는 SHA512)를 사용하여 생성됩니다.

최종 연결

debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic
debug1: Next authentication method: publickey
debug1: Trying private key: /Users/jinhyeokhong/.ssh/linux.pem
debug1: Authentication succeeded (publickey).
Authenticated to 52.79.236.180 ([52.79.236.180]:22).
debug1: channel 0: new [client-session]
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
debug1: pledge: filesystem full
debug1: client_input_global_request: rtype hostkeys-00@openssh.com want_reply 0
debug1: client_input_hostkeys: searching /Users/jinhyeokhong/.ssh/known_hosts for 52.79.236.180 / (none)
debug1: client_input_hostkeys: searching /Users/jinhyeokhong/.ssh/known_hosts2 for 52.79.236.180 / (none)
debug1: client_input_hostkeys: hostkeys file /Users/jinhyeokhong/.ssh/known_hosts2 does not exist
debug1: Sending environment.
debug1: channel 0: setting env LC_TERMINAL_VERSION = "3.4.15"
debug1: channel 0: setting env LANG = "ko_KR.UTF-8"
debug1: channel 0: setting env LC_TERMINAL = "iTerm2"
Learned new hostkey: RSA SHA256:gtc6vF/Uit3fyV9LzqZshelloiUDQnM+Vz+pUorgood
Learned new hostkey: ECDSA SHA256:XCIsShelloEscqDlKZfveryqgaakNRKZHPgoodM7Cc
Adding new key for 52.79.236.180 to /Users/jinhyeokhong/.ssh/known_hosts: ssh-rsa SHA256:gtc6vF/Uit3fyV9LzqZshelloiUDQnM+Vz+pUorgood
Adding new key for 52.79.236.180 to /Users/jinhyeokhong/.ssh/known_hosts: ecdsa-sha2-nistp256 SHA256:XCIsShelloEscqDlKZfveryqgaakNRKZHPgoodM7Cc
debug1: update_known_hosts: known hosts file /Users/jinhyeokhong/.ssh/known_hosts2 does not exist

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
16 package(s) needed for security, out of 26 available
Run "sudo yum update" to apply all updates.

~/.ssh/known_hosts에 추가된 new key

  • 서버의 공개키가 로컬에 저장되있는 것을 확인할 수 있다.

SSH Key란 ?

서버에 접속할 때 비밀번호 대신 key를 제출하는 방식이다.
SSH Key는 언제 사용하는가 ?

  • 비밀번호보다 높은 수준의 보안을 필요로 할 때
  • 로그인 없이 자동으로 서버에 접속할 때

SSH Key가 동작하는 방식

SSH Key는 공개키(public key)와 비공개 키(private key)로 이루어지는데 이 두개의 관계를 이해나는 것이 SSH Key를 이해하는데 핵심이다. 키를 생성하면 공개키와 비공개키가 만들어진다. 이 중에 비공개키는 로컬 머신(SSH Client)에 위치해야 하고, 공개키는 리모트 머신(SSH Server)에 위치해야 한다.

파일설명
id_rsaprivate key (절대로 타인에게 노출되면 안된다)
id_rsa.pubpublic key 접속하려는 리모트 머신의 authorized_keys에 입력한다.
authorized_keys리모트 머신의 .ssh 디렉토리 아래에 위치하면서 id_rsa.pub 키의 값을 저장한다.

0개의 댓글