SSH(Secure Shell)는 원격으로 리눅스 서버에 접속하여 관리할 수 있는 필수적인 도구입니다. 하지만 기본 설정을 그대로 사용하면 보안에 취약할 수 있습니다. 여기서는 SSH의 보안을 강화하기 위해 기본 포트를 변경하고 Root 계정의 직접적인 SSH 로그인을 금지하는 방법을 안내합니다.
⚠️ 중요: 시작 전 주의사항
- 백업: 설정 파일을 수정하기 전에 반드시 원본 파일을 백업해 두는 것이 좋습니다.
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak - 새로운 사용자 계정 생성 및 Sudo 권한 부여: Root 로그인을 비활성화하기 전에, 반드시
sudo권한을 가진 일반 사용자 계정을 생성하고 해당 계정으로 SSH 로그인이 가능한지 확인해야 합니다. 그렇지 않으면 서버에 영구적으로 접근하지 못하게 될 수 있습니다.- 계정 생성:
sudo adduser [사용자명] - Sudo 권한 부여:
sudo usermod -aG wheel [사용자명]
- 계정 생성:
- 방화벽 설정: SSH 포트를 변경하면, 반드시 시스템 방화벽(예:
firewalld)에서 새로 변경된 포트를 허용해야 합니다. - 연결 유지: 설정 변경 작업은 최소 두 개의 터미널 세션을 열어두고 진행하는 것이 안전합니다. 하나는 작업을 진행하고, 다른 하나는 문제가 생겼을 때 복구용으로 사용합니다.
1단계: SSH 설정 파일 열기
SSH 서버의 설정은 /etc/ssh/sshd_config 파일에서 관리합니다. 텍스트 편집기(예: vi, nano)를 사용하여 이 파일을 엽니다. (반드시 sudo 또는 root 권한으로 실행해야 합니다.)
sudo vi /etc/ssh/sshd_config
# 또는
sudo nano /etc/ssh/sshd_config
2단계: SSH 포트 변경
sshd_config 파일 내에서 #Port 22 또는 Port 22라고 된 부분을 찾습니다.
#기호가 있다면 주석이므로,#을 삭제하여 활성화합니다.- 포트 번호
22를 원하는 다른 번호로 변경합니다. (일반적으로 1024 이상의 비특권 포트 중 사용되지 않는 포트를 선택하는 것이 좋습니다. 예를 들어2222또는10022등)
변경 전
#Port 22
변경 후 (예시: 2222 포트 사용)
Port 2222
팁: 보안을 위해 기존 22번 포트와 새 포트를 동시에 열어두고 테스트한 후, 문제가 없으면 22번 포트를 주석 처리하거나 삭제하는 방법도 있습니다.
3단계: Root 로그인 금지
sshd_config 파일 내에서 #PermitRootLogin 또는 PermitRootLogin 부분을 찾습니다.
#기호가 있다면 삭제하여 활성화합니다.- 값을
no로 변경합니다. 이는 Root 계정으로 SSH를 통해 직접 로그인하는 것을 금지합니다.
변경 전 (예시)
#PermitRootLogin prohibit-password
# 또는
PermitRootLogin yes
변경 후
PermitRootLogin no
4단계: 설정 파일 저장 및 종료
vi편집기:Esc키를 누르고:wq를 입력한 후Enter키를 누릅니다.nano편집기:Ctrl + X를 누르고,Y를 누른 다음Enter키를 누릅니다.
5단계: (필수) 방화벽 설정 변경
새로운 SSH 포트를 방화벽에서 허용해야 합니다.
sudo firewall-cmd --add-port=2222/tcp --permanent # 2222는 새로 설정한 포트 번호
sudo firewall-cmd --reload # 방화벽 규칙 다시 로드
# 만약 기존 22번 포트를 막으려면: sudo firewall-cmd --remove-port=22/tcp --permanent
6단계: SSH 서비스 재시작
변경된 설정을 적용하기 위해 SSH 서비스를 재시작합니다.
sudo systemctl restart sshd
7단계: 변경 사항 확인
새로운 터미널을 열고 변경된 설정으로 SSH 접속을 시도합니다.
- 일반 사용자 계정으로 새 포트로 접속:정상적으로 접속되고,
sudo명령이 동작하는지 확인합니다. ssh [사용자명]@[서버_IP_주소] -p 2222 # -p 옵션으로 변경된 포트 지정- Root 계정으로 접속 시도:"Permission denied" 또는 유사한 메시지가 나오면서 접속이 거부되는지 확인합니다.
ssh root@[서버_IP_주소] -p 2222
모든 것이 정상적으로 작동하면, 이제 여러분의 SSH 서버는 이전보다 더 안전하게 설정되었습니다. Root 권한이 필요한 작업은 일반 사용자 계정으로 로그인한 후 sudo 명령을 사용하시면 됩니다.
Rocky Linux는 RHEL(Red Hat Enterprise Linux) 기반이며 systemd를 사용하여 서비스를 관리합니다. 따라서 SSH 서비스(데몬)를 재시작하는 표준적인 방법은 systemctl 명령어를 사용하는 것입니다.
SSH 서비스 재시작 명령어
sudo systemctl restart sshd
설명:
sudo: 이 명령어는 시스템 서비스를 관리하므로 root 권한이 필요합니다. 따라서sudo를 사용하여 명령을 실행합니다.systemctl:systemd시스템 및 서비스 관리자에게 명령을 내리는 도구입니다.restart: 지정된 서비스를 중지했다가 다시 시작하라는 명령입니다.sshd: SSH 데몬(서버) 서비스의 이름입니다. (간혹ssh인 경우도 있지만, Rocky Linux에서는sshd가 표준입니다.)
관련 명령어
- SSH 서비스 상태 확인:이 명령은 SSH 서비스가 현재 실행 중인지, 비활성화되었는지, 오류가 있는지 등의 상태를 보여줍니다.
sudo systemctl status sshd - SSH 서비스 시작:
sudo systemctl start sshd - SSH 서비스 중지:
sudo systemctl stop sshd - SSH 설정 파일 다시 로드 (Reload):
restart와 달리reload는 서비스를 완전히 중지하지 않고 설정 파일(/etc/ssh/sshd_config)만 다시 읽어 들입니다. 따라서 현재 연결된 SSH 세션을 끊지 않고 변경 사항을 적용할 수 있습니다. 설정 파일을 수정한 후에는restart대신reload를 사용하는 것이 더 좋습니다 (단, 포트 변경 등 일부 주요 변경 사항은restart가 필요할 수 있습니다).sudo systemctl reload sshd
주의: SSH 서비스를 재시작하거나 중지하면 현재 연결된 모든 SSH 세션이 끊어질 수 있습니다. 원격으로 작업 중이라면 주의해서 실행해야 합니다. 특히 설정 변경 후 재시작할 때는 반드시 변경된 설정으로 접속이 가능한지 다른 터미널에서 확인한 후에 기존 세션을 종료하는 것이 안전합니다.
8단계: sudo 명령어 실행 시 항상 비밀번호를 묻도록 설정
sudo 명령어 실행 시 항상 비밀번호를 묻도록 설정하려면, sudo의 비밀번호 타임아웃(timestamp_timeout) 설정을 변경해야 합니다. 기본적으로 sudo는 한번 인증하면 일정 시간(보통 5분 또는 15분) 동안 비밀번호를 다시 묻지 않습니다.
이 타임아웃 시간을 0으로 설정하면, sudo를 실행할 때마다 비밀번호를 입력하게 됩니다.
⚠️ 경고: /etc/sudoers 파일은 시스템의 핵심 설정 파일입니다. 잘못 수정하면 sudo 명령을 사용할 수 없게 되어 시스템 관리에 심각한 문제가 발생할 수 있습니다. 반드시 visudo 명령어를 사용하여 수정하고, 내용을 정확히 확인하십시오.
방법 1
- visudo 실행:
터미널에서 다음 명령어를 실행하여 sudoers 설정 파일을 안전하게 엽니다. visudo는 파일을 저장하기 전에 구문 검사를 해주어 실수를 방지하는 데 도움이 됩니다. 이 명령은 시스템의 기본 편집기(보통 vi 또는 nano)로 /etc/sudoers 파일을 엽니다. - sudo visudo
- timestamp_timeout 설정 추가
파일의 적당한 위치 (보통 Defaults 설정들이 모여 있는 곳이나 파일 하단)에 다음 줄을 추가합니다.- Defaults: 기본 설정을 지정합니다.
- timestamp_timeout=0: 비밀번호 캐시 시간을 0분으로 설정합니다. 즉, 캐시 하지 않고 항상 묻도록 합니다.
- Defaults timestamp_timeout=0
- 파일 저장 및 종료:
- vi 편집기: Esc 키를 누른 후 :wq를 입력하고 Enter 키를 누릅니다. (만약 저장하지 않고 종료하려면 :q!)
- nano 편집기: Ctrl + X를 누르고, 변경 사항 저장 여부를 묻는 메시지에 Y를 누른 다음, Enter 키를 누릅니다.
방법 2 (권장)
/etc/sudoers 파일을 직접 수정하는 대신, /etc/sudoers.d/ 디렉터리에 별도의 설정 파일을 만드는 것이 더 안전하고 관리하기 좋습니다.
- 새 파일 생성:(-f 옵션을 사용하여 새 파일을 visudo로 엽니다. 파일 이름은 원하는 대로 지정할 수 있습니다.)
- sudo visudo -f /etc/sudoers.d/custom-timeout
- 설정 추가:
새로 열린 파일에 다음 내용을 입력합니다. - Defaults timestamp_timeout=0
- 파일 저장 및 종료:
위와 동일한 방법으로 저장하고 종료합니다. visudo는 이 파일의 권한도 자동으로 적절하게 설정해 줍니다. (만약 visudo를 사용하지 않고 직접 파일을 만들었다면, sudo chmod 440 /etc/sudoers.d/custom-timeout 명령으로 권한을 설정해야 합니다.)
확인
설정을 마친 후, 터미널에서 sudo 명령어를 두 번 연속으로 실행해 보세요.
sudo ls -l /root
# 비밀번호 입력
sudo ls -l /root
# 다시 비밀번호를 묻는지 확인
두 번째 명령어 실행 시에도 비밀번호를 묻는다면 설정이 성공적으로 적용된 것입니다.
문제 해결
# sudo systemctl restart sshd
Job for sshd.service failed because the control process exited with error code.
See "systemctl status sshd.service" and "journalctl -xeu sshd.service" for details.
SSH 서비스 재시작에 실패했다는 메시지입니다. 설정 파일에 오류가 있거나 다른 문제로 인해 sshd 데몬이 정상적으로 시작되지 못하는 상황입니다.
가장 중요한 것은 오류 메시지에서 제안하는 두 가지 명령어를 실행하여 정확한 원인을 파악하는 것입니다.
1. systemctl status sshd.service 실행
이 명령은 sshd 서비스의 현재 상태와 최근 로그 요약 정보를 보여줍니다. 터미널에 다음 명령어를 입력하고 그 결과를 확인해 보세요.
sudo systemctl status sshd.service
2. journalctl -xeu sshd.service 실행
이 명령은 sshd 서비스와 관련된 상세한 시스템 로그를 보여줍니다. 보통 실패의 구체적인 원인이 되는 오류 메시지가 여기에 포함되어 있습니다. 다음 명령어를 입력하고 출력되는 내용을, 특히 빨간색이나 굵게 표시된 부분을 주의 깊게 살펴보세요.
sudo journalctl -xeu sshd.service
이 명령을 실행하고, 출력되는 내용의 마지막 부분이나 오류(error), 실패(failed), 경고(warning)와 관련된 메시지를 확인해 보세요. 보통 "sshd_config: line [숫자]..."와 같이 어떤 설정 때문에 문제가 발생했는지 알려주는 경우가 많습니다.
[ 예시]
sshd[3622]: error: Bind to port 2022 on 0.0.0.0 failed: Permission denied.
sshd[3622]: error: Bind to port 2022 on :: failed: Permission denied.
sshd[3622]: fatal: Cannot bind any address.
의미
SSH 서버(sshd)가 설정된 2022번 포트를 사용하려고 했지만, 권한 거부(Permission denied) 오류로 인해 실패했습니다. 즉, 시스템이 sshd에게 2022번 포트를 사용할 권한을 주지 않은 것입니다.
원인
Rocky Linux와 같은 RHEL 계열 리눅스에서는 SELinux(Security-Enhanced Linux) 보안 모듈이 활성화되어 있는 경우가 많습니다. SELinux는 기본적으로 SSH 서버(sshd)가 잘 알려진 22번 포트만 사용하도록 허용합니다. 따라서 새로운 포트(2022)를 사용하려면 SELinux 정책에 이 포트를 SSH용으로 명시적으로 허용해 주어야 합니다.
해결 방법
semanage 명령어를 사용하여 SELinux에 2022번 포트를 SSH 서비스(ssh_port_t)용으로 추가합니다.
- semanage 명령어 설치 (이미 설치되어 있다면 건너뛰기)
semanage 명령어가 없다면, 다음 명령어로 필요한 패키지를 설치합니다. - sudo dnf install policycoreutils-python-utils
- SELinux에 새 포트 추가
다음 명령어를 실행하여 2025번 포트를 TCP 프로토콜의 SSH 포트 타입(ssh_port_t)으로 추가합니다.- -a: 추가(add)
- -t ssh_port_t: 타입을 SSH 포트로 지정
- -p tcp: 프로토콜을 TCP로 지정
- 2022: 허용할 포트 번호
- sudo semanage port -a -t ssh_port_t -p tcp 2022
- SSH 서비스 재시작
SELinux 정책을 업데이트한 후, SSH 서비스를 다시 시작합니다. - sudo systemctl restart sshd
- 상태 확인
서비스가 정상적으로 시작되었는지 확인합니다. 이제 Active: active (running) 상태로 표시되어야 합니다. - sudo systemctl status sshd
추가 확인
- 방화벽: 이전에 방화벽에서 2022번 포트를 허용했는지 다시 한번 확인하십시오.
sudo firewall-cmd --list-ports | grep 2022/tcp
만약 목록에 없다면 추가해야 합니다.sudo firewall-cmd --add-port=2022/tcp --permanent sudo firewall-cmd --reload
위 단계를 진행하시면 SELinux 권한 문제로 인해 SSH 서비스가 시작되지 못하는 문제를 해결할 수 있을 것입니다.
'Cook Server' 카테고리의 다른 글
| Rocky 리눅스에 PostgreSQL을 설치하기 (0) | 2025.05.28 |
|---|---|
| Rocky 리눅스의 호스트 이름 변경하는 법 (0) | 2025.05.27 |
| Rocky 리눅스에 nginx 설치 및 설정 (0) | 2025.05.27 |