리눅스 SSH 원격 접속은 암호화되지 않아 보안에 취약한 텔넷(Telnet)을 대체하는 사실상의 표준이다. 이 글에서는 CentOS·RHEL 계열에 OpenSSH 서버를 설치하고 /etc/ssh/sshd_config의 핵심 지시어를 설정하는 과정을 정리한다. 키 기반 인증, 방화벽·SELinux, 그리고 루트 로그인 차단 같은 보안 강화 팁까지 설치 → 설정 → 인증 → 보안 순서로 다룬다.
목차
OpenSSH란?
SSH(Secure Shell)는 네트워크를 통해 원격 호스트에 안전하게 접속하고 명령을 실행하는 프로토콜이다. OpenSSH는 이 SSH 프로토콜의 오픈소스 구현체로, CentOS·RHEL·Rocky·AlmaLinux 등 대부분의 리눅스 배포판에 기본 탑재되어 있다. 서버 데몬은 sshd, 클라이언트 명령은 ssh다.
지난 포스팅에서 다룬 텔넷(Telnet)과 비교하면 SSH의 장점이 분명하다. 텔넷은 인증 정보와 데이터를 평문으로 전송해 패킷을 가로채면 비밀번호가 그대로 노출되지만, SSH는 모든 통신을 암호화한다.
- 암호화: 인증 정보·전송 데이터를 모두 암호화해 도청·변조를 방지한다.
- 무결성 검사: 전송 중 데이터 변조 여부를 검증한다.
- 다양한 인증: 비밀번호뿐 아니라 공개키 기반 인증을 지원한다.
- 기본 포트 22번: SSH의 표준 포트는 22번이다.
![[리눅스] OpenSSH 설정 SSH 원격 접속 개념도](https://nuschool.cc/wp-content/uploads/2024/07/image-1.png)
OpenSSH 서버 설치와 가동
서버 패키지 이름은 openssh-server다. 먼저 설치 여부를 확인하고, 없다면 설치한다. CentOS·RHEL에서는 대개 기본으로 설치·가동되어 있다.
# 설치 여부 확인
rpm -qa | grep openssh-server
# 설치되어 있지 않다면 설치 (root는 sudo 생략 가능)
yum -y install openssh-server
설치 후 systemctl로 서비스를 시작하고, 부팅 시 자동 실행되도록 등록한 뒤 상태를 확인한다. 데몬 이름은 sshd다.
systemctl start sshd
systemctl enable sshd
systemctl status sshd
# 출력 예시
● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; ...)
Active: active (running) since ...
상태가 active (running)이면 정상이다. 22번 포트가 실제로 열려 LISTEN 중인지도 함께 확인해 두면 좋다.
# ss 명령(권장) 또는 netstat로 LISTEN 포트 확인
ss -tnlp | grep :22
# 출력 예시
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1234,fd=3))
sshd_config 핵심 설정
서버 동작은 설정 파일 /etc/ssh/sshd_config에서 결정한다. 수정 전 원본을 백업해 두면 문제가 생겼을 때 되돌리기 쉽다.
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
vi /etc/ssh/sshd_config
자주 쓰는 핵심 지시어는 다음과 같다. 줄 앞에 #이 붙어 있으면 주석(기본값)이라는 뜻이며, 값을 바꾸려면 주석을 해제하고 수정한다.
| 지시어 | 예시 값 | 의미 |
|---|---|---|
| Port | 22 | sshd가 수신할 포트. 기본 22번. |
| PermitRootLogin | no | root 원격 로그인 허용 여부. 보안상 no 권장. |
| PasswordAuthentication | yes | 비밀번호 인증 허용. 키 인증 전환 시 no. |
| PubkeyAuthentication | yes | 공개키 기반 인증 허용. 기본 yes. |
| AllowUsers | user1 user2 | 지정한 사용자만 접속 허용(공백 구분). |
예를 들어 root 로그인을 막고 특정 사용자만 허용하려면 다음과 같이 설정한다.
Port 22
PermitRootLogin no
PasswordAuthentication yes
PubkeyAuthentication yes
AllowUsers devuser
접근 제어 지시어는 DenyUsers → AllowUsers → DenyGroups → AllowGroups 순서로 처리된다. AllowUsers를 한 줄이라도 지정하면 거기에 없는 사용자는 모두 접속이 거부되니 주의한다. 설정을 바꾼 뒤에는 문법 검사를 거쳐 서비스를 재시작한다.
# 설정 파일 문법 검사 (오류 없으면 출력 없음)
sshd -t
# 변경 사항 반영
systemctl restart sshd
키 기반 인증 설정
비밀번호 인증은 무차별 대입(brute-force) 공격에 취약하다. 공개키 기반 인증으로 전환하면 비밀번호 없이도 안전하게 접속할 수 있다. 클라이언트에서 키 쌍(개인키·공개키)을 만들고, 공개키만 서버에 등록하는 방식이다.
1) 키 쌍 생성
클라이언트(접속하는 PC)에서 ssh-keygen으로 키 쌍을 만든다. 기본적으로 개인키는 ~/.ssh/id_ed25519, 공개키는 ~/.ssh/id_ed25519.pub에 저장된다.
# ed25519 키 생성 (권장). RSA를 쓰려면 -t rsa -b 4096
ssh-keygen -t ed25519
2) 공개키를 서버에 등록
생성한 공개키를 서버의 ~/.ssh/authorized_keys에 등록한다. ssh-copy-id를 쓰면 한 번에 처리된다.
# 공개키를 서버 계정의 authorized_keys에 자동 등록
ssh-copy-id devuser@서버IP
ssh-copy-id가 없는 환경이라면 공개키 내용을 직접 추가해도 된다. 이때 디렉터리·파일 권한이 맞지 않으면 키 인증이 동작하지 않으니 권한 설정에 유의한다.
# (서버에서) 권한 설정 — sshd는 권한이 느슨하면 키를 무시한다
mkdir -p ~/.ssh
chmod 700 ~/.ssh
# 공개키 내용을 authorized_keys에 추가한 뒤
chmod 600 ~/.ssh/authorized_keys
3) 비밀번호 인증 비활성화
키 인증이 정상 동작하는 것을 먼저 확인한 뒤, sshd_config에서 비밀번호 인증을 끈다. 검증 전에 끄면 키에 문제가 있을 때 접속 자체가 막힐 수 있으니 순서를 반드시 지킨다.
# /etc/ssh/sshd_config
PasswordAuthentication no
PubkeyAuthentication yes
sshd -t
systemctl restart sshd
방화벽과 SELinux 설정
기본 22번 포트를 쓰는 경우 CentOS·RHEL은 보통 방화벽에 SSH 서비스가 이미 허용되어 있다. 하지만 포트를 바꾸면 방화벽과 SELinux를 모두 새 포트에 맞게 갱신해야 한다. 둘 중 하나라도 빠지면 접속이 막힌다.
firewalld 포트 개방
예를 들어 SSH 포트를 2222번으로 변경했다면, 방화벽에서 해당 포트를 영구 허용한 뒤 다시 로드한다.
# 기본 22번이면 service ssh 허용으로 충분
firewall-cmd --permanent --add-service=ssh
# 포트를 2222로 바꿨다면 새 포트 허용
firewall-cmd --permanent --add-port=2222/tcp
firewall-cmd --reload
# 적용 확인
firewall-cmd --list-all
SELinux 포트 등록
SELinux는 SSH가 사용할 수 있는 포트를 ssh_port_t 타입으로 제한한다. 기본 22번이 아닌 포트를 쓰려면 그 포트를 ssh_port_t에 등록해야 한다. 등록을 빠뜨리면 sshd가 새 포트로 바인딩하지 못하고 Permission denied 오류가 SELinux 로그에 남는다.
# semanage가 없으면: yum -y install policycoreutils-python-utils
semanage port -a -t ssh_port_t -p tcp 2222
# 등록 확인
semanage port -l | grep ssh
![[리눅스] OpenSSH 설정 SSH 접속 성공 화면](https://nuschool.cc/wp-content/uploads/2024/06/image-28.png)
방화벽·SELinux까지 마쳤다면 클라이언트에서 접속을 테스트한다. 포트를 바꿨다면 -p 옵션으로 새 포트를 지정한다.
# 기본 포트
ssh devuser@서버IP
# 변경한 포트(2222)로 접속
ssh -p 2222 devuser@서버IP
윈도우에서는 SSH 클라이언트가 기본 제공되지 않던 시절 Putty 같은 프로그램을 많이 썼다. 호스트 이름(또는 IP)에 서버 IP, 포트에 22(또는 변경한 포트), 연결 형식에 SSH를 지정하면 동일하게 접속할 수 있다. 다만 최신 Windows 10·11에는 OpenSSH 클라이언트가 내장되어 ssh 명령을 바로 쓸 수 있다.
SSH 보안 강화 팁
SSH는 외부에 노출되는 서비스이므로 무차별 대입 공격의 단골 표적이다. 다음 설정으로 공격 표면을 크게 줄일 수 있다.
- 루트 직접 로그인 차단:
PermitRootLogin no로 설정하고, 일반 계정 접속 후su·sudo로 권한을 얻는다. - 키 인증 전환:
PasswordAuthentication no+PubkeyAuthentication yes로 비밀번호 대입 공격 자체를 차단한다. - 접속 사용자 제한:
AllowUsers또는AllowGroups로 SSH 접속이 필요한 계정만 명시적으로 허용한다. - 기본 포트 변경: 22번 대신 1024보다 큰 임의 포트로 바꾸면 자동화된 스캔을 줄일 수 있다(방화벽·SELinux 갱신 필수).
한 가지 강조할 점은 안전장치를 남겨 두는 것이다. 원격으로 설정을 바꾸다 접속이 끊기면 복구가 어렵다. 새 설정 적용 전 별도의 SSH 세션을 하나 더 열어 두거나, 콘솔 접근이 가능한 환경에서 작업하기를 권한다.
자주 묻는 질문
설정을 바꿨는데 적용되지 않는다
sshd_config 수정 후에는 반드시 systemctl restart sshd로 데몬을 재시작해야 한다. 또한 같은 지시어가 파일 위쪽에 이미 활성화돼 있으면 먼저 나온 값이 적용되니, 주석 해제한 줄이 중복되지 않았는지 확인한다.
포트를 바꿨더니 접속이 안 된다
포트 변경 시에는 ① sshd_config의 Port ② 방화벽(firewall-cmd --add-port) ③ SELinux(semanage port -a -t ssh_port_t) 세 곳을 모두 갱신해야 한다. SELinux 등록을 빠뜨리는 경우가 가장 흔하다.
키 인증이 동작하지 않고 비밀번호를 계속 묻는다
대개 권한 문제다. ~/.ssh는 700, ~/.ssh/authorized_keys는 600이어야 한다. 권한이 느슨하면 sshd가 보안상 키를 무시한다. 서버 로그(/var/log/secure)를 확인하면 원인을 좁힐 수 있다.
정리
지금까지 CentOS·RHEL에서 OpenSSH 서버를 구축하는 과정을 정리했다. 핵심 순서는 openssh-server 설치 → sshd 가동 → sshd_config 설정(Port·PermitRootLogin·AllowUsers 등) → 키 기반 인증 전환 → 방화벽·SELinux 개방 → 서비스 재시작이다. 텔넷과 달리 모든 통신을 암호화하는 SSH는 실무 원격 접속의 표준이며, 여기에 루트 로그인 차단·키 인증·포트 변경까지 더하면 한층 안전한 원격 접속 환경을 갖출 수 있다.



💬 댓글 0