SSH 키, OpenSSH 키, 그리고 내 서버에 키를 사용해서 로그인하기

HYEONG HWAN, MUN/ 3월 30, 2022/ 미분류/ 0 comments

https://blog.lael.be/post/10999

이 글을 통해 무심코 그냥 사용하고 있는, SSL, HTTPS, RSA, Public key 암호화 방식에 대해 알아보도록 하자.

공개 키와 개인 키

공개 키 인증은 암호 인증보다 더 안전합니다. 이것은 컴퓨터가 인터넷에서 노출되어 있는 경우 특히 중요합니다.
만약 암호 인증 만으로도 충분히 안전하다고 생각한다면 서버의 /var/log/auth.log 파일을 살펴보십시오.

공개 키 인증 방식의 요소는, 공개 키개인 키로 이루어져 있습니다. 각 키는 특별한 수학적 속성을 가진 엄청나게 큰 숫자입니다.

공개 키 알고리즘 표준 - RSA 방식 알아보기
Q) 221 = A * B 일 때, 각 A, B 는 무엇인가?
A) 13 * 17

이처럼 2개의 매우 큰 소수(prime number)를 찾은 후 이것들을 곱한 값을 사용하는 방식이 RSA 암호화.

Q) 2140324650240744961264423072839333563008614715144755017797754920881418023447140136643345519095804679610992851872470914587687396261921557363047454770520805119056493106687691590019759405693457452230589325976697471681738069364894699871578494975937497937
= A * B 일 때, 각 A, B 는 무엇인가?
A) 64135289477071580278790190170577389084825014742943447208116859632024532344630238623598752668347708737661925585694639798853367
* 33372027594978156556226010605355114227940760344767554666784520987023841729210037080257448673296881877565718986258036932062711

슈퍼컴퓨터로 1년 계산하면 250digit(RSA-250)는 private key 를 찾아서 해독할수 있다.
현재 표준으로 쓰이는 RSA-3072925digit 이기 때문에, 현재 기술로는 수천년 걸려야 풀수 있을 것이다. (3072log(2))
아주 가끔 쓰이는 RSA-40961234digit 이기 때문에, 아마도 안풀릴 것이다. (4096log(2))

RSA Key 를 사용한 암호화 방식 알아보기 : https://cs.hofstra.edu/~cscvjc/Spring06/Slides/Sess03/img46.html

 

개인 키는 당신이 로그인 하고자 하는 컴퓨터에 저장되고, 공개 키는 로그인 하고자하는 서버의 ~/.ssh/authorized_keys 파일에 저장됩니다.
공개 키 인증 방식으로 로그인 하고자 할 때, 서버는 당신의 개인 키로만 해독할 수 있도록, 공개 키 암호화를 수행하여 응답을 합니다.

더 자세한 설명제가 작성한 이 글에서 (https://blog.lael.be/post/5107) 어떻게 SSL 은 암호화 통신을 하는가? 부분을 살펴보세요.

 

< 그림 : 개인 키를 암호로 보호 >

대부분의 ssh 프로그램들은 개인 키를 암호로 보호할 수 있게 옵션을 제공합니다. 개인 키를 암호로 보호하면 컴퓨터를 도난 당하거나, 보안 침입이 일어나서, 개인 키가 탈취 되었을때, 암호로 보호된 개인 키가 crack 되기 전에 ~/.ssh/authorized_keys 등에서 삭제할 충분한 시간을 벌어줍니다. (물론, 개인 키를 보호한 암호가 짧고 단순하지 않아야함)

< 개인 키를 암호로 보호할 경우, 사용할 때마다 암호를 물어본다 >

 

공개 키는 일반적으로 다음의 형식을 사용합니다.

<암호화 방식> <base64 인코딩된 문자> <코멘트>

 

공개 키 예시

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCHuzOiVhYChYmYp0IWNtraoY2u/L/NuwRHx/BAV7Kf8ryeCf9NPUh+fGHcq/5gaw5zA5GHDoaK8mAMr45fIqpGa/rUZvwXLj0B5NcYbwvrCjTYsVJp920FDDvnW8ZML/VB5JJRkEAaTzbrO1+RQ+aKxpj1xACMGX3YLGpNCrWQ9ofiCYsz7qs6CUx89s2agBm86Za96X/AC5kQ/TnushogkdW1PDIr1+gxuwhZ4I0dcVydSfayeCyl9Nkp1HagVJu3o4Evq312YH4aq1gBkXCBgIKdxcmE4UQor6OSmU45AFrgzuvcV4iL/UTcl3XKy9tU5030NeniEJsr7DMztCp2c5r5Pa6EeDVavrSLQRzIeRQrkWMWoxMB51tn7PiBHKGURuB06grN4V4Ra5DITDcvHrO5hp1h/QBuxrnn+J0+vQTAtPHY5oa5GZRvGi/tJ3KEow0zQNBpuHuBfWx40toXEKE8Cr1/kWyzVB6Kc0AOO8PKbEZSWJAwOoJ6VUvckI8= test1@ip-10-0-100-15
ssh-dss AAAAB3NzaC1kc3MAAACBAO2fqlz5bflWj/zhZSPqhU+PSGQN/OHcfeMw+MifH+PARXmTWUDsk8F986Nz7mv9MWcZduLUznBsz3sCQCJBn4FM6GkhRWhUeqA2AiTXz4NfQTBvyLW9sePoloAYbpqMHYA3ppXtM+neBUj5QIwl6hviszIqlBw9XM0+SI+1/+o/AAAAFQDfEqTjNINpgzAUTOd+FjybrkxYfQAAAIEA1ONG0bWRFqr8Q0Kd+aCYMuKOijkpchJ75VGdkfo83nE4cMMN8rGe+qEqxPsiRKgRf744cWzZdcUSTBLtPMiOEHTI8It4u6T2jTHxmpT+D6kXg3aXg5idHIjuGymk1rl+kEHPzbAvK9PuyLTJrvONoG4T3Y4lMfkdBkObwf/LTHMAAACAIh+zZ5mhdLYI5b28U0wUJy2q6WCtou7JlJNzyLrkse2YMS4UDSt17ZVzNI1phzCInfoyGlRP8SeAwVwAvjBJzfJ+2gt7GnmFImKX5qvnFLWG394zdScS5COHcVQX8Dh7DO8RjbPzogqsofTTPr2kQwCR8TvG7rOznJrUywoqNNc= test1@ip-10-0-100-15
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAII1kYP7MINM2Jt8WVrO5KBVLnmvbA2Vl+llcKS0AHtY3 test1@ip-10-0-100-15
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBDxao+JFS+rpaNyOUn/dXngdxfyICrsKjbiVttaQE4z+3Zyicz9ahT1Q6gGxfVnLmCNZGMBEMgHJLd991f+z0zY= test1@ip-10-0-100-15

 

공개 키 포맷

현재 키의 기본 암호화 수준은 RSA 3072 입니다.
공개 키의 base64 인코딩을 풀어서 Byte 로 변환한 후, 각 바이트를 살펴봅니다.

length - value, length - value, length - value 형식입니다.

(4 bytes) 00 00 00 07 = 7
(7 bytes) 73 73 68 2d 72 73 61 = "ssh-rsa" (US-ASCII)
(4 bytes) 00 00 00 03 = 3
(3 bytes) 01 00 01 = 65537 (a common value for the RSA exponent)
(4 bytes) 00 00 01 81 = 385(RSA 3072), (257 if RSA 2048), (513 if RSA 4096) (공식은 나누기 8, + 1)
(385 bytes) 00 87 bb .. dc 90 8f = The key modulus

= 407 Byte

ssh-rsa 방식이고, 지수 65537, 키값 을 알 수 있습니다.

 

순서대로 나머지 공개 키 분석 결과

ssh-dss

ssh-ed25519

ecdsa-sha2-nistp256

 

키 기반 SSH 로그인

키 기반 인증은 OpenSSH에서 사용할 수 있는 여러 인증 모드 중에서 가장 안전합니다. 키 기반 인증은 암호 인증에 비해 몇 가지 장점이 있습니다. 예를 들어 키 값은 충분한 키 길이가 제공되는 일반 암호보다 무차별 암호 대입 또는 추측하기가 훨씬 더 어렵습니다. 다른 인증 방법(OTP, FIDO)은 매우 특정한 상황에서만 사용됩니다.

SSH는 “RSA”(Rivest-Shamir-Adleman) 또는 “DSA”(“디지털 서명 알고리즘”) 암호화 알고리즘을 주로 사용합니다. 이 두 가지 모두 SSH가 발명되었을 때 최첨단 알고리즘으로 간주되었지만 DSA는 최근 몇 년 동안 덜 안전한 것으로 간주되었습니다. RSA는 새 키에 대해 권장되는 선택이므로 “RSA 키”와 “SSH 키”는 같은 의미로 사용됩니다.

ssh-rsa 암호화 방식, exponent는 65537를 사용하는 경우가 대부분이므로, public key 파일의 99.99% 이상은 ssh-rsa AAAAB3NzaC1yc2EAAAADAQAB 라는 글자로 시작할겁니다. (hex byte 로는 00 00 00 07 73 73 68 2D 72 73 61 00 00 00 03 01 00 01)

키 기반 인증은 두 개의 키를 사용합니다. 하나는 누구나 볼 수 있는 “공개” 키이고 다른 하나는 소유자만 볼 수 있는 “개인” 키입니다. 키 기반 인증을 사용하여 안전하게 통신하려면 키 쌍을 만들고 개인 키를 로그인하려는 컴퓨터에 안전하게 저장하고 공개 키를 로그인하려는 컴퓨터에 저장해야 합니다.

 

RSA 키 페어를 생성하고 리눅스 서버 자동 로그인 설정하는 방법

먼저 RSA 키 페어를 생성합니다. 당신의 컴퓨터의 OS가 MacOS 또는 Linux 이어야 합니다. 만약 아니라면 Mac 컴퓨터를 구매하세요. 또는 Linux 서버에서 실행하세요.

- MacMini(입문용) 구매링크 : https://www.coupang.com/

- 또는 여분의 PC무료 OSUbuntu Desktop (https://ubuntu.com/download/desktop) 을 설치하고 Visual Studio Code 로 개발하는 것도 추천합니다.

 

 

키페어 생성

ssh-keygen -m pem

중간의 -m pem 은 pem 형식으로 생성하는 명령어이다. pem format 호환성이 가장 높으므로 이렇게 생성하는 것이 좋습니다.

 

< ssh-keygen manual >

위 명령어는 아래의 명령어와 동일합니다.

ssh-keygen -m pem -t rsa -b 3072 -C "id@hostname"

 

엔터만 누르면 기본위치에, 개인키를 비밀번호 보호 없이 생성합니다.

해당 위치에 이동하면 개인 키와 공개 키가 생성되어 있습니다. 텍스트 에디터나 vi 에디터로 열어봅시다.

복사 붙여넣기 및 사용이 쉽도록 base64 로 인코딩 되어 있습니다.

이 중 개인 키 id_rsa 파일은 절대로 공유되어서는 안되는 파일이고, id_rsa.pub 는 상대 시스템에 공유되어야 하는 파일입니다.

RFC 8017 에 의해서 private key 파일에는 public key 파일을 포함합니다. 따라서 public key 는 분실되어도 private key 에서 추출해서 다시 생성할 수 있습니다.

RSAPublicKey ::= SEQUENCE {
    modulus INTEGER, -- n
    publicExponent INTEGER -- e
}

RSAPrivateKey ::= SEQUENCE {
    version Version,
    modulus INTEGER, -- n
    publicExponent INTEGER, -- e
    privateExponent INTEGER, -- d
    prime1 INTEGER, -- p
    prime2 INTEGER, -- q
    exponent1 INTEGER, -- d mod (p-1)
    exponent2 INTEGER, -- d mod (q-1)
    coefficient INTEGER, -- (inverse of q) mod p
    otherPrimeInfos OtherPrimeInfos OPTIONAL
}

RSA private key 에는 RSA public key 에 담겨야 하는 정보(modulus, exponent)를 가지고 있어서, private key 를 사용해서 public key 생성이 가능하다.

< Public Key 는 Modulus 와 Exponent 로 구성된다. >

 

이렇게 byte 데이터를 분석해서 살펴볼 필요는 없고, id_rsa.pub 파일만 목적지 서버에 등록하면 됩니다.

 

< 목적지 서버에서 로그인 후 >

mkdir ~/.ssh
chmod 700 ~/.ssh
vi ~/.ssh/authorized_keys

[public key 내용을 붙여넣기]

chmod 600 ~/.ssh/authorized_keys

 

< 테스트 : 내 PC 에서 >

ssh 해당사용자id@서버의ip

 

위의 명령어는 아래와 동일합니다.

ssh -i ~/.ssh/id_rsa 해당사용자id@서버의ip

 

한번 쯤 다음의 명령어를 사용해서 인증의 자세한 단계를 확인 할 수 있습니다.

ssh -v 해당사용자id@서버의ip

 

RSA Private Key 가 유출되었을 경우 대처

개인 키가 유출 되었을 경우, 제 3자가 당신의 권한을 사용할 수 있습니다.
따라서 자동 키 인증을 사용하지 못하도록, 서버의 .ssh/authorized_keys 에서 해당키 항목을 삭제해야 합니다.

 

Private Key 로그인시 실행 명령어 설정

/bin/bash 쉘 대신 해당 명령이 실행되고, 종료됩니다.

no-port-forwarding,no-agent-forwarding,no-X11-forwarding,command="echo 'Please login as the user \"ubuntu\" rather than the user \"root\".';echo;sleep 10" ssh-rsa ACEGI3KzbC5yc7EAAAADAQABAAABAQCCNq9S1wYGFQl/SSWl4B1/N7YLUDwSlhBYp6hz+qs8pNsV4nZdVwR0ZihrE2aJifXi5kqF79DZXM136ZSUI8iwkwl+uZbqqkH11qESid7JiAJ+JXXQEnT7K3Hiw57xFWgp78FiTrD/qxkYNawqiO00kr6LNNdNqQ5Mwx/m+SY2Jhl//GWnOam/UfXCnwjRL20MuGfpd3ikYYNP3+xgr0HCv3VGBH7CSg8jEPNX+PdPf94fAa7fpOobDKynk5MIU++SW/YzIEykG14tHMitJvTieR5KoQt6/UG585otDRCVBq/m0II5j28HteY6ZOGEaXTYHNopgFiKPoQvJQ64gIB3 mykey1

간혹 자신만의 프로그램(gcc) 또는 쉘스크립트(bash) 를 제작하고, 키오스크 처럼 동작하기를 바라는 경우가 있습니다.
이 경우 위의 빨간 부분 위치에 자신의 프로그램이 실행되도록 설정해보세요.

 


추가 사항 : RSA 키의 지문(fingerprint) 알아보기

RSA 인증시 표시되는 키의 지문(fingerprint)을 알아보자.
여러가지 인증과 로그에 표시되는 사항이므로 public key 에 대해서 표시된다.
RSA private key 가 public key 를 포함하고 있으므로, public key 의 finger print 와, private key 의 finger print 는 동일하다.

예제를 위해서, 키를 바로 생성해 보았다.

 

이 키를 github 에 등록해 보았다.

자동으로 key fingerprint 를 보여준다. 즉, key fingerprint 는 PrivateKey - PublicKey 에 대한 구분자 라고 볼 수 있다.

 

키 기반 로그인을 설정하였고, 키를 사용한 로그인을 하였다. 그 후 서버의 인증 로그를 살펴보았다.

어떤 키를 사용해서 로그인 했는지 알 수 있다.

역시나 구분자는 key fingerprint 이다.

 

key fingerprint 추출 방법 (SHA256)

# ssh-keygen -lf id_rsa.pub

public key 의 파일 경로를 맞추어 실행해 보자.

 

# ssh-keygen -lf id_rsa

private key 에 대해서 실행해도 fingerprint 를 알 수 있다.

 

key fingerprint 추출 방법 (MD5)

# ssh-keygen -lE md5 -f id_rsa.pub

fingerprint 를 SHA256 대신 MD5 형태로 추출해 보자. 과거의 시스템에서는 MD5 형태의 fingerprint 를 사용하였다.

 

# ssh-keygen -lE md5 -f id_rsa

 

암호화 종류 : RSA
암호화 강도 : 3072 bit
키 지문(SHA256) : SHA256:S7abhxYxhBa2+C5D/gDurzjehrjY5KJuR7gMAL5LGcY
키 지문(MD5) : MD5:ee:84:e0:74:fa:17:2c:2b:d9:0b:a7:41:73:25:68:18
코멘트 : test2@ip-10-0-100-15

 

Leave a Comment

작성하신 댓글은 관리자의 수동 승인 후 게시됩니다.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
*
*