포스트

리눅스 (4) - SSH

리눅스 (4) - SSH

SSH 개념 정리부터 Key 기반 접속 및 설정 자동화까지

서버 관리나 개발 작업을 하다 보면 외부 서버에 원격으로 접속해야 하는 일이 빈번하게 발생한다.

이때 가장 기본적이고 널리 사용되는 보안 프로토콜이 바로 SSH(Secure Shell)다.

이번 글에서는 SSH의 주요 개념과 특징, 그리고 실제 우분투(Linux) 환경에서 SSH 서버를 구축하고 SSH Key 기반 비밀번호 없는 접속을 설정하는 방법까지 단계별로 정리해 본다.


1. SSH(Secure Shell)란?

개요

  • SSH(Secure Shell)는 네트워크상에서 다른 컴퓨터에 로그인하거나 원격 시스템 명령을 안전하게 실행할 수 있도록 지원하는 보안 네트워크 프로토콜이다.
  • 과거에 사용되던 Telnet이나 FTP 등은 데이터(비밀번호, 명령어 등)를 평문(Plaintext)으로 전송하여 스니핑(Sniffing) 해킹 공격에 매우 취약했다.
  • SSH는 클라이언트와 서버 간의 모든 통신 내용을 암호화하여 높은 보안성을 제공한다.

주요 특징

  1. 강력한 암호화: 전송되는 모든 데이터를 암호화하여 외부 노출을 방지한다.
  2. 인증(Authentication): 접속을 시도하는 사용자가 올바른 사용자인지 검증한다. (비밀번호 방식, 공개키/개인키 방식 지원)
  3. 무결성(Integrity): 전송 중인 데이터가 중간에 위변조되지 않았음을 보장한다.
  4. 데이터 압축: 데이터를 압축해서 전송하므로 네트워크 전송 효율성이 좋다.
  5. 클라이언트-서버 모델: 기본적으로 클라이언트-서버 형태로 작동하며, 표준 포트는 22번을 사용한다.
  6. 키 기반 인증 권장: 비밀번호 접속보다는 안전한 SSH Key(공개키/개인키) 인증 방식을 권장한다.

주요 활용 사례

  • 원격 터미널 접속: 서버에 접속해 터미널 환경 제어
  • SFTP / SCP: 보안 채널을 활용한 안전한 파일 전송
  • SSH Tunneling: 보안이 취약한 다른 프로토콜의 통신을 SSH 터널로 감싸 안전하게 전송
  • Git 원격 저장소: GitHub, GitLab 등에서 코드를 Push/Pull 할 때 인증 수단으로 사용

2. SSH 서버 설치 및 기본 접속 방법

서버 환경 설정 (SSH Server)

가장 먼저 접속을 받아줄 리눅스 서버에 SSH 데몬을 설치하고 서비스를 활성화한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 1. OpenSSH 서버 패키지 설치
sudo apt -y install openssh-server

# 2. SSH 서비스 시작
sudo systemctl start ssh

# 3. 부팅 시 자동 실행 설정
sudo systemctl enable ssh

# 4. SSH 서비스 상태 확인
systemctl status ssh

# 5. 방화벽(UFW)에서 22번 포트 허용
sudo ufw allow 22/tcp

외부 클라이언트에서 기본 접속

클라이언트 터미널에서 아래 명령어로 서버에 접속할 수 있다.

1
2
ssh 사용자이름@IP주소 -p 포트번호

참고: 처음 접속하는 서버일 경우, 서버의 신뢰성을 확인하는 인증 fingerprint 메시지가 출력된다. yes를 입력하고 패스워드를 입력하여 진행한다.


3. SSH Key를 이용한 안전한 접속 (비밀번호 인증 대체)

SSH Key 방식은 비대칭(Asymmetric) 암호화 알고리즘인 공개키(Public Key)와 개인키(Private Key) 쌍을 이용하는 방식이다. 비밀번호를 탈취당할 위험을 줄이고, 매번 비밀번호를 입력하는 번거로움을 해결할 수 있다.

Step 1. 클라이언트에서 키 쌍 생성

클라이언트 PC의 터미널에서 최신 암호화 알고리즘인 ed25519 기반의 키 쌍을 생성한다.

1
2
ssh-keygen -t ed25519

(키 저장 경로 및 비밀번호(passphrase)를 묻는 창이 나오면 Enter를 눌러 기본값으로 진행한다.)

Step 2. 서버에 공개키 전송

생성한 공개키를 원격 서버에 등록한다.

1
2
ssh-copy-id -p 포트번호 사용자이름@서버IP

⚠️ [트러블슈팅] ssh-copy-id 실행 시 Permission denied (publickey) 오류 발생 시

클라우드 인스턴스(AWS EC2, Ncloud 등)나 특정 우분투 환경에서는 /etc/ssh/sshd_config 파일에서 분명 PasswordAuthentication yes로 설정했음에도 불구하고 ssh-copy-id 실행 시 비밀번호 입력 창이 뜨지 않거나 접속이 거부되는 경우가 발생할 수 있다.

나도 그러한 경우가 있었다.

원인: /etc/ssh/sshd_config 파일 상단을 보면 보통 Include /etc/ssh/sshd_config.d/*.conf 지시어가 포함되어 있다.

OpenSSH는 먼저 읽힌 설정값의 우선순위가 더 높기 때문에, /etc/ssh/sshd_config.d/50-cloud-init.conf 등 하부 설정 파일에 정의된 PasswordAuthentication no가 메인 파일(66번째 줄 근처)의 yes 설정보다 먼저 읽혀 우선권을 가져가 버리기 때문이다.

해결 방법: 하부 설정 파일의 비밀번호 인증 옵션을 yes로 직접 수정해 주어야 한다.

1
2
3
# 1. cloud-init 설정 파일 수정
sudo vim /etc/ssh/sshd_config.d/50-cloud-init.conf

파일 내부에서 PasswordAuthentication 항목을 찾아 yes로 변경한다.

1
2
3
# 수정 전: PasswordAuthentication no
PasswordAuthentication yes

1
2
3
# 2. SSH 서비스 재시작
sudo systemctl restart ssh

이후 다시 클라이언트에서 ssh-copy-id를 실행하면 정상적으로 비밀번호를 묻는 창이 뜨며 공개키가 서버로 복사된다.

공개키를 성공적으로 복사한 후에는 보안을 높이기 위해 다시 PasswordAuthentication no 로 바꿔놓는다.


Step 3. 서버 측 권한 및 설정 확인

원격 서버의 SSH 보안을 보장하기 위해 개인 디렉토리 권한을 확인하고 필요 시 설정을 변경해 준다.

1
2
3
4
5
6
7
# 디렉토리 및 공개키 모음 파일 권한 설정 (서버 내 수행)
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

# SSHD 설정 파일 수정
sudo vim /etc/ssh/sshd_config

/etc/ssh/sshd_config 파일 내부에서 아래 주석 처리된 항목들을 찾아서 주석(#)을 해제하고 활성화한다.

1
2
3
4
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication yes

설정을 수정한 후에는 반드시 SSH 서비스를 재시작해야 한다.

1
2
sudo systemctl restart ssh

Step 4. SSH Key 기반 접속 테스트

클라이언트에서 생성했던 비밀키(id_ed25519)를 지정하여 접속한다.

1
2
ssh -i ~/.ssh/id_ed25519 사용자이름@서버IP


4. SSH 접속 간편화 (Config 파일 활용)

매번 IP 주소, 포트 번호, 계정명, 키 경로를 일일이 입력하는 과정은 꽤 번거롭다. ~/.ssh/config 파일을 사용하면 단 한 줄의 별칭 명령어만으로 서버에 접속할 수 있다.

클라이언트 설정 방법

  1. 클라이언트 PC에서 SSH config 파일을 편집한다. ```bash vim ~/.ssh/config
1
2
3
4
5
6
7
8
9

2. 아래의 형식으로 서버 정보를 작성해 준다.
```text
Host myserver
    HostName 192.168.64.16
    User etakyung
    IdentityFile ~/.ssh/id_ed25519

  1. 이제 간편하게 설정한 Host 이름만으로 즉시 원격 접속이 가능하다. ```bash ssh myserver

```


💡 마치며

SSH는 단순한 리눅스 접속 도구를 넘어, DevOps 및 서버 운용 과정의 가장 기본적인 보안 통로 역할을 한다.

매번 비효율적으로 비밀번호를 입력하기보다 SSH Key 생성 및 config 설정을 통해 훨씬 더 안전하고 효율적인 작업 환경을 구축하면 좋다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.