가상 머신 구축 및 실습을 통해 SSH 인증키 생성 방식 이해하기 - 1
앞서 공부한 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이다.
글이 조금 길어져서 뒷 부분은 다음 글로 이어서 작성하겠습니다 !