본문 바로가기
Back-End Basic😼

SSH: Secure SHell

by ZZiwon Choi 2024. 9. 10.

SSH: 원격 호스트에 접속하기 위한 프로토콜. 포트 번호 22번을 기본 값으로 사용(변경 가능)

 

🧷 Shell

  • OS 기능을 사용자가 사용할 수 있게 하는 프로그램
  • OS의 핵심 기능을 감싸고 있고, OS를 대할 때 우리가 만지게 되는 "겉 껍질" 이라는 의미에서 "shell"이라는 단어를 사용
  • shell 의 두 종료
    • Graphical User Interface(GUI): 우리가 쓰는 화면 
    • Command Line Interface(CLI): 명령줄로 OS 기능을 호출하게 해주는 프로그램

1. 서버 접속

$ ssh -p [ssh port] [host 주소]

 

2. Linux 비밀 번호 변경

$ passwd

 

💡 SSH 접속 후 구조

- SSH는 원격 서버로 통신 터널을 뚫는 프로토콜이다. 

- SSH 터널의 서버 쪽 끝에 서버 포트가 있다. 

- 클라이언트 포트는 OS가 정해주는 포트를 랜덤하게 사용한다. 

 

💡 ID/비번을 이용한 SSH 접속의 문제점

- 서버가 100대라면, 비번을 모두 동일하게 하면 보안상 문제 발생

- 서버 100대를 스크립트로 관리, SSH 접속 때마다 언제 비번을 다 타이핑 할까

-패스워드 유출 문제

- 외부 개발자가 잠깐 접속 해야하는 경우

-비번 변경시 모든 서버 비번 변경 문제

 

=> 이러한 문제들을 해결하기 위해 비번보다 ssh key 사용

 

3. 내 컴퓨터에서 SSH Key 생성

$ ssh-keygen -t rsa

실행하면 생성한 키가 저장될 파일을 물어본다. 보통 그냥 엔터 누르고 키 생성. 비밀번호 나중에 입력

-t: 키 타입을 지정하는 옵션, -t rsa: RSA 알고리즘을 이용한 키를 생성하는 것을 의미

 

4. 생성된 SSH Key 확인

$ ls ~/.ssh

실행하면 id_rsa, id_rsa.pub 이름의 파일이 나온다. pub이 붙은 파일이 public key이고 다른 하나가 private key이다. 

private key는 외부에 절대로 공개해서는 안되는 파일. public key만 외부에 뿌릴수 있다. 

 

5. 1번에서 접속한 서버에서 SSH Key 생성

$ ssh-keygen -t ed25519

ed25519도 rsa 와  유사한 암호 알고리즘이다. 

$ ls -la ~/.ssh

위 명령어 실행 시 id_ed25519, id_ed25519.pub 파일이 생성된걸 확인할 수 있다. 

 

6. SSH Key를 서버 측 접근 허용 목록에 등록

$ ssh -p 10022 localhost

위 명령어는 아이디를 지정하지 않고 지금 내 아이디를 그대로 쓰게 해준다.  자기 자신이 로컬에서 접속하는데고 비밀번호를 쳐야 된다.

귀찮으니까 허용 목록에 나의 ssh key를 등록해보자

ssh public key를 authorized_keys에 저장

$ cd ~./ssh
$ cat id_ed25519.pub > authorized_keys

다시 6번의 처음 명령어를 실행하면 비밀번호를 물어보지 않을것이다. 

이 작업으로 비밀번호 변경 혹은 삭제를 하지 않아도 각 사람의 public key로 권한을 허용할 수 있다. 

+

The authenticity of host '[localhost]:10022 ([127.0.0.1]:10022)' can't be established.

ED25519 key fingerprint is SHA256:VKbEGh8rop8iFZuZQUiaIHTyYRjSNHUxhyBFub0tdE4.

This host key is known by the following other names/addresses:

    ~/.ssh/known_hosts:1: [hashed name]

Are you sure you want to continue connecting (yes/no/[fingerprint])?  

위 문구는 특정 호스트에 최초로 ssh 접속 시  key fingerprint를 등록할때 물어보는 문구로 yes를 치면 다시 물어보지 않는다. 

 

7. 서버에서 Private Key 가져오기

자기 자신이 아닌 외부에서 접속하는 경우에는 private key가 필요하다. 서버는 public key를 등록했지만 나는 대응되는 private key를 가지고있지 않다. 내 컴퓨터로 private key를 가져와야 한다. 

$ cd ~/.ssh
$ scp -P [ssh port] [서버주소]:.ssh/id_ed25519 .

 위 명령어를 실행하고 1번 명령어를 실행하면 비밀번호 없이 접속이 가능할 것이다. 

 

8. ssh -i 로 private key 파일 명시하기

위 방법은 key 파일을 명시하지 않았는데 이 경우는 ssh가 ~./ssh 아래 id_rsa나 id_ed25519 같은 잘 알려져 있는 파일을 찾는다.

경우에 따라 key를 여러개 쓰는 경우 잘 알려지지 않은 이름을 써야 될 수 있다. 이 경우 private key의 경로를 명시할 필요가 있다.

예를 들어 파일 명을 id_ed25519를 ed25519로 변경했다면

$ ssh -i ~/.ssh/ed25519 -p [ssh port] [서버 주소]

위 명령어로 private key 경로 명시 

-i는 private key 파일의 경로를 지정하는 역할을 한다. 

 

9. 서버에 개인 컴에서 생성한 RSA 키 등록

3번 단계에서 생성한 rsa 키를 서버 계정에 허용 키로 등록해보자. 

is_rsa.pub 파일을 서버 쪽 .ssh/authorized_keys에 복사해준다. 

$ cat id_rsa.pub >> ~/.ssh/authorized_keys

위 명령어 실행 후 ssh -i id_rsa로 로그인 접속 시도해보면 된다.

 

10. key 파일 명시 없이 Agent를 이용한 접속

위에서는 ssh -i를 통해서 private key 파일을 명시했다.  하지만 매번 private key를 지정하는 것은 번거롭다. 

key들을 메모리에 한번에 로딩하고 필요할 때 마다 이 key 작업을 대신 처리해주는 ssh agent를 사용하는 경우가 많다. 

-> agent한테 비밀키를 등록하고 보관하는 것

10-1. Agent 띄우기

$ eval $(ssh-agent -s)
$ ssh-add -l
$ ssh-add ed25519
$ ssh-add -l

만약 잘 알려진 키 파일이라면 ssh-add 만 실행해도 된다. 

8번 단계에서 알려지지 않은 key로 접속을 할때는 -i 로 명시를 해줬어야 했지만 Agent에 ed25519를 등록해놔서 따로 명시하지 않아도 잘 접속된다. 

 

11. SSH Agent key 파일 추가/삭제

$ ssh-add [키 파일 위치]
$ ssh-add -d [키 파일 위치]

 

암호가 걸려있는 private key의 경우 SSH Agent를 사용해 agent에 등록할 때 한 번만 암호를 입력하면 된다.