Study/Study

가상 머신 구축 및 실습을 통해 SSH 인증키 생성 방식 이해하기 - 1

TTOII 2022. 4. 13. 20:58
728x90
 

SSH-keygen을 이용한 인증키 생성의 방법과 원리

SSH가 뭐야 ? SSH 키 생성을 위해 사용하는 ssh-keygen 명령은 비밀키를 먼저 만들고 그 값과 passphase를 활용해 공개키를 만든다. 따라서 같은 페어가 아닌 키들은 동시에 사용될 수 없다. ssh-keygen은 SSH

nice-engineer.tistory.com

 

앞서 공부한 SSH-keygen을 방식을 실제 VM을 사용해 실습해 볼 것이다. 

 

✔️ 실습 환경 구성 

✔️ vscode 설치 

PS C:\Users\Shinsohui> choco install vscode -y

✔️ vs 설치 확인 

PS C:\Users\Shinsohui> code

✔️ 디렉토리 생성 후 Vagrantfile 생성하기

PS C:\Users\Shinsohui> mkdir ansible
PS C:\Users\Shinsohui> cd .\ansible\
PS C:\Users\Shinsohui\ansible> code Vagrantfile

아래 내용을 Vagrantfile에 붙여넣기 해준다.

Vagrant.configure("2") do |config|
	# Define VM
	config.vm.define "controller" do |centos|
		centos.vm.box = "centos/7"
		centos.vm.hostname = "controller"
		centos.vm.network "private_network", ip: "192.168.100.10"
		centos.vm.provider "virtualbox" do |vb|
			vb.name = "controller"
			vb.cpus = 2
			vb.memory = 2048
		end
	end
	# Define VM
	config.vm.define "node1" do |centos|
		centos.vm.box = "centos/7"
		centos.vm.hostname = "node1"
		centos.vm.network "private_network", ip: "192.168.100.11"
		centos.vm.provider "virtualbox" do |vb|
			vb.name = "node1"
			vb.cpus = 2
			vb.memory = 2048
		end
	end
	# Define VM
	config.vm.define "node2" do |centos|
		centos.vm.box = "centos/7"
		centos.vm.hostname = "node2"
		centos.vm.network "private_network", ip: "192.168.100.12"
		centos.vm.provider "virtualbox" do |vb|
			vb.name = "node2"
			vb.cpus = 2
			vb.memory = 2048
		end
	end
end

✔️ 가상 머신 활성화

PS C:\Users\Shinsohui\ansible> vagrant up

virtualbox를 열어보면 Vagrantfile에 선언한 가상 머신 3대가 생성 및 실행된 것을 확인할 수 있다.

✔️ Windows terminal 세팅


controller(client) ------------------> node1 (server)

controller(client) ------------------> node2 (server)

 

✔️ 실습

✔️ 현재 접속 계정 확인

id 명령을 통해 현재 접속한 사용자는 vagrant임을 알 수 있다.

✔️ 클라이언트 정보 확인 

가장 하단에 $ 표시로 구분되어 있는 내용을 볼 수 있다.

해석하자면 1번 알고리즘을 사용하고 있는 것과 salt 값, 실제 해시된 값을 나타내고 있다.

node1(server)에 접속 시 각각 ECDSA 알고리즘 방식의 지문이 각각 SHA256과 MD5로 해시한 내용과 일치하는지를 물어본다. yes를 입력 시 아직은 Permission denied가 뜨고 ~/.ssh/known_hosts를 열어보면 서버의 공개키가 저장되어 있는 것을 확인할 수 있다. 이제 다음번에 접속하면 같은 질문을 던지지 않는다.

 

정리하자면 ~/.ssh/known_hosts에 저장된 서버의 공개키가 SHA256 방식과 MD5 방식으로 해시되었을 때의 내용을 물어보는 것이다.

 

✔️ 서버의 공개키 방식 확인

node1(server)의 /etc/ssh 디렉토리에 접근한 내용이다. 클라이언트는 3가지 알고리즘 방식 중 하나를 선택할 수 있다. 

node1(server)의 /etc/ssh/ssh_host_ecdsa_key.pub의 내용과 controller(client)의 .ssh/known_hosts에 들어있는 서버의 공개키 내용이 일치하는 것을 확인할 수 있다. 

 

✔️ ssh 접속 시 fingerprint 확인

아까 yes를 하는 순간 클라이언트는 서버의 공개키를 얻고 해당되는 시스템(서버)의 ip나 도메인을 붙여 식별한다.

여기서 known_host 파일을 지워보면 다시 같은 질문을 하게되며 앞에서 보았던 서버의 공개키와 같은 내용을 다시 한번 확인할 수 있다. 

 

✔️ 서버의 공개키를 미리 확인하기

ssh-keygen -l -f /etc/ssh/ssh_host_ecdsa_key.pub

이때 서버측에서 다음 명령을 사용해 지문을 미리 만들 수 있다. 이 내용은 클라이언트 측에서 cat으로 확인했던 그 내용과 동일하다. 미리 이 정보를 알고 있으면 좋은 상황이다.

 

✔️ 서버의 공개키를 미리 가져와 클라이언트의 공개키와 대조하기

ssh-keyscan [서버의 ip 주소]

ssh-keyscan을 이용해 서버의 키를 미리 받을 수 있다.

네트워크로 전송되는 것이기 때문에 잘못된 정보가 전달되면 위험할 수는 있다는 단점은 있다.

서버는 현재 3가지의 알고리즘을 제공하고 있다는 것을 알 수 있다. 

 

✔️ 서버의 해시된 공개키를 가져와 대조해보기

ssh-keyscan -t ecdsa [서버의 ip 주소] | ssh-keygen -l -f -

-t 옵션을 이용해 각 알고리즘 별로 서버의 공개키를 확인할 수 있으며 pipe를 사용해 SHA256 방식으로 해시된 fingerprint도 확인해 볼 수 있다.

 

✔️ fingerprint 질문 없이 서버로 접속하는 법 

ssh-keyscan 명령을 사용해 클라이언트의 /.ssh/known_hosts 파일에 서버의 공개키를 ecdsa 방식으로 저장해두면 

ssh [서버의 ip] 로 접속할 수 있게 된다. (== fingerprint를 물어보지 않는다.)

 

✔️ ssh 설정 파일

ssh_config는 클라이언트의 설정 파일이며 sshd_config는 서버의 설정 파일이다. (d는 demon을 의미한다.)

 

✔️ /etc/ssh/sshd_config 설정 파일 (서버 파일)

서버측의 /etc/ssh/sshd_config 파일을 열면 PasswordAuthentication no 라는 항목이 보인다. 

이는 패스워드 인증을 거부한다는 의미이며 default 설정이다. 보안 때문이다.

GSSAPIAthentication yes → 키 기반의 인증만이 허용되어 있다.

 

controller(client)시스템에서 node1(server)으로 ssh 인증을 편하게 하기 위해서는 키 기반의 인증을 하는 것이 좋고 키를 등록하기 위해서는 패스워드 인증이 필요하다. 이를 위해 패스워드 인증을 임시로 살려놓아야 한다.

ssh의 설정 파일이 변경되었으니 sshd 서비스를 재가동한다.

[vagrant@node1 ~]$ sudo systemctl restart sshd

이제 클라이언트에서 ssh [서버의 ip] 로 접근하면 패스워드 기반으로 인증되며 패스워드는 아이디와 같은 vagrant이다. 

 

글이 조금 길어져서 뒷 부분은 다음 글로 이어서 작성하겠습니다 !

728x90