[Bash] ssh 비밀번호 없이 접근하기

2023. 10. 27. 16:12Developers 공간 [Shorts]/Software Basic

728x90
반응형
<분류>
A. 수단
- OS/Platform/Tool : Linux, Kubernetes(k8s), Docker, AWS
- Package Manager : node.js, yarn, brew, 
- Compiler/Transpillar : React, Nvcc, gcc/g++, Babel, Flutter

- Module Bundler  : React, Webpack, Parcel

B. 언어
- C/C++, python, Javacsript, Typescript, Go-Lang, CUDA, Dart, HTML/CSS

C. 라이브러리 및 프레임워크 및 SDK
- OpenCV, OpenCL, FastAPI, PyTorch, Tensorflow, Nsight

 


1. What? (현상)

ssh를 활용해 서버에 접근하는 경우 미리 공개키를 만들어 비밀번호 없이 접근하는 방법을 알고 싶습니다.

 


2. Why? (원인)

 

ssh에서는 암호 대신 key를 활용해 접근할 수 있는데 이는 공개키 방식으로, private keypublic key 한 쌍으로 구성됩니다.

 

즉, client가 private key를 가지고 암호화(encrypt)를 하면, server가 public key를 가지고 복호화(decrypt)를 합니다.

[https://etloveguitar.tistory.com/143]

  • 연결 순서는 아래와 같으며 그림은 위를 참조합니다.
    1. Client → Server : SSH connection을 요청시작합니다.
    2. Server → Client : 랜덤으로 메시지를 보냅니다.
    3. Client → Server : private key를 사용하여 메시지를 암호화합니다
    4. Server : public key를 사용해 메시지를 복호화합니다.
    5. Server → Client : 메시지가 일치하면 client의 접근을 허용합니다.

3. How? (해결책)

Client에서 Server로 접근할 때, 각각의 PC에서 해야할 방법에 대해 설명하겠습니다.

** Server는 123.456.789.011 이며 port는 8888이라고 가정하겠습니다.

 

 

Step1. 비밀번호로 접근 가능하도록

 

먼저 key로 접근하기 전에 비밀번호로 접속이 가능하게 해주는 과정을 살펴보겠습니다.

 

위에서 port를 8888로 하겠다고 했으므로, 서버측에서 port를 8888로 지정해주기 위해 /etc/ssh/sshd_config파일 내에 아래와 같이 수정해줍니다.

** sshd는 ssh접속(inbound)을 대기하기 위해 돌고 있는 Daemon Process입니다. ssh에 대한 설정은 위와 달리 /etc/ssh/ssh_config에서 확인할 수 있습니다.

...
Port 8888
...

 

그다음 서버측에서 아래와 같이 ssh daemon을 재실행해줍니다.

# Restart service
sudo service sshd restart # CentOS/Fedora
sudo service ssh restart # Ubuntu/Debian

sudo systemctl status ssh

 

이번엔 비밀번호로 접근가능하도록  /etc/ssh/sshd_config파일 내 아래와 같이 수정해줍니다. 바꿔주는 김에 루트로도 로그인이 가능하도록 바꾸어주겠습니다.

...
PermitRootLogin yes
...
PasswordAuthentication yes
...

 

이제 위와 같이 다시 ssh daemon을 재실행해줍니다.

 

클라이언트측에서는 아래와 같이 접근해줍니다.

ssh -p 8888 root@123.456.789.011

 

 

Step2. private key를 가지고 접근가능하도록

 

이번엔 위에서 설명한 것과 같이 private key를 가지고 접근가능하도록 해보겠습니다.

 

1. (클라이언트) 이미 접근했던 이력을 없애기

 

먼저 클라이언트측에서 서버에 이미 접근했던 이력을 없애기 위해 아래와 같은 명령어를 진행해줍니다.

ssh-keygen -R 123.456.789.011

# 포트가 있는 경우
ssh-keygen -R [123.456.789.011].8888

 

~/.ssh/known_hosts 위치에 있는 파일을 보면, 내용에 사라진 것을 확인할 수 있습니다.

 

2. 키 생성

 

아래와 같이 키를 생성해줍니다. 아래 예시에서는 첫번째 명령어를 활용하겠습니다.

ssh-keygen -t rsa

# -t rsa : RSA Algorithm
# -b 2048 : 2048bits key length
# -m PEM : PEM style key
# -f .pem : file name
ssh-keygen -t rsa -b 2048 -m PEM -f ~/.ssh/mykey.pem

# -y : private key path
ssh-keygen -y -f mykey.pem > mykey.pub

 

아래 두가지가 생깁니다. id_rsa는 개인키이고 id_rsa.pub은 공개키이다.

  • id_rsa.pub : 공개키
  • id_rsa (id_rsa.pem) : 개인키

개인키는 사용하기 전에 아래와 같이 권한을 설정해주어야합니다.

chmod 400 id_rsa

 

서버는 공개키만이 필요하므로 서버에 공개키만을 복사해줍니다.

scp -r -P 8888 id_rsa.pub user@123.456.789.011:/home/user2/.ssh/id_rsa2.pub

 

3. (서버) 비밀번호 접근 불가 

이번엔  /etc/ssh/sshd_config파일 내 아래와 같은 옵션을 바꾸어 PasswordAuthentication 옵션을 꺼줍니다.

...
PasswordAuthentication no
...

 

역시나 ssh daemon을 재실행해줍니다.

 

4. (서버) authorized_keys에 추가

 

마지막으로 앞에서 복사해주었던 공개키를 서버의 authorized_keys에 추가해줍니다.

# authorized_keys에 내용이 이미 존재하는 경우
cat /home/user2/.ssh/id_rsa2.pub >> ~/.ssh/authorized_keys

# authorized_keys에 내용이 없는 경우
cp /home/user2/.ssh/id_rsa2.pub ~/.ssh/authorized_keys

chmod 600 ~/.ssh/authorized_keys

 

이제 클라이언트에서는 비밀번호 없이 개인키를 활용해 접근이 가능합니다.

ssh -p 8888 -i /local/path/to/id_rsa.pem root@123.456.789.011

 

 

Step3. key를 고정해두고 Config에 등록해두기

 

위와 같이 하면 ssh에서 접근시 항상 개인키의 위치를 알고 있어야만 접근이 가능합니다.

 

이번엔 이 개인키 없이 단축키로 접근이 가능하도록 만드는 방법을 살펴보려고 합니다. 개인키는 아래와 같은 위치에 위치시키겠습니다.

mkdir -p ~/.ssh
cp id_rsa.pem ~/.ssh/
chmod 400 id_rsa.pem

 

이제 ~/.ssh/config에 아래와 같이 등록합니다.

Host node1
    HostName 123.456.789.011
    User root
    Port 8888
    IdentityFile ~/.ssh/id_rsa.pem

 

이제 클라이언트에서는 아래와 같이 단축키를 활용해 접근이 가능합니다.

ssh node1

 


https://etloveguitar.tistory.com/143

728x90
반응형