Rocky Linux SSH 설치하고 보안 설정까지 직접 해본 과정

Rocky Linux에 openssh-server를 설치하고 firewalld 허용, sshd_config 보안 강화, 키 인증, 포트 변경, fail2ban까지 직접 세팅한 과정을 정리했습니다.

Rocky Linux에 SSH 서버를 설치하고 외부에서 안전하게 접속하려면 openssh-server 패키지 설치, 방화벽 허용, sshd_config 보안 설정 세 가지가 핵심이고, 제가 직접 Rocky 9 서버를 세팅하면서 겪은 삽질 포인트까지 정리했어요.

처음 Rocky Linux 서버를 받았을 때 당연히 SSH가 되겠거니 했거든요. 근데 minimal 설치 이미지로 올린 서버라 openssh-server가 아예 없었어요. 터미널 앞에서 한참 "왜 안 되지?" 하면서 시간을 날렸던 기억이 나요.

SSH 설치 자체는 금방인데, 진짜 문제는 그 다음이에요. 기본 설정 그대로 두면 포트 22에 root 로그인이 열려 있어서 하루에 수천 건의 무차별 로그인 시도가 들어오거든요. 설치부터 보안 강화까지, 한 번에 끝내는 게 맞아요.

Rocky Linux 터미널에서 SSH 접속 명령어 입력
Rocky Linux 터미널에서 SSH 접속 명령어 입력

OpenSSH 서버 설치와 서비스 활성화

Rocky Linux 데스크톱 설치본에는 보통 OpenSSH가 기본 포함돼 있어요. 문제는 서버용 minimal 설치인데, 이 경우 openssh-server 패키지가 빠져 있을 수 있거든요. 먼저 설치 여부부터 확인하는 게 좋아요.

rpm -qa | grep openssh-server 명령을 쳐서 아무 출력도 안 나오면 설치가 안 된 거예요. 저도 처음에 이걸 모르고 systemctl start sshd만 계속 쳤다가 "Unit sshd.service not found" 메시지만 봤어요.

설치 전에 패키지를 최신 상태로 맞춰주는 게 먼저예요. sudo dnf upgrade --refresh 한 번 돌리고 나서, sudo dnf install openssh-server -y로 설치하면 돼요. 의존성 패키지까지 자동으로 잡아주니까 별도 작업은 필요 없어요.

설치가 끝나면 서비스 활성화가 필요해요. 두 줄이면 끝나요.

sudo systemctl enable --now sshd

이 한 줄이면 서비스 시작과 부팅 시 자동 실행까지 동시에 설정돼요. sudo systemctl status sshd로 확인했을 때 "active (running)"이 보이면 성공이에요. 그리고 ss -tlnp | grep :22로 22번 포트가 LISTEN 상태인지도 같이 체크해두세요.

Rocky 9 기준으로 OpenSSH 8.7p1이 설치되고, Rocky 10이라면 9.9p1 버전이 들어가요. ssh -V 명령으로 확인할 수 있어요.

방화벽(firewalld) 설정으로 SSH 허용하기

OpenSSH를 설치했는데 외부에서 접속이 안 되는 경우, 열에 아홉은 방화벽 문제예요. Rocky Linux는 기본으로 firewalld가 활성화돼 있거든요.

먼저 현재 방화벽 상태를 확인해보세요. sudo firewall-cmd --list-all을 치면 services 항목에 ssh가 있는지 바로 보여요. 대부분의 Rocky Linux 설치에서는 SSH가 기본 허용돼 있지만, 커스텀 설치나 클라우드 이미지에서는 빠져 있을 때가 있어요.

ssh 서비스가 목록에 없다면 이렇게 추가하면 돼요.

sudo firewall-cmd --add-service=ssh --permanent
sudo firewall-cmd --reload

--permanent 플래그 없이 하면 재부팅 후 설정이 날아가요. 저도 한 번 이걸 빼먹고 추가했다가, 서버 재시작하니까 접속이 끊겨서 콘솔로 들어가야 했어요. 꽤 아찔한 경험이었거든요.

⚠️ 주의

원격으로 서버를 관리하는 상황이라면, 방화벽 규칙을 변경할 때 절대 현재 SSH 세션을 끊지 마세요. 새 터미널을 열어서 접속이 되는지 확인한 후에 기존 세션을 닫는 습관이 필요해요. 잘못하면 서버에 물리적으로 접근해야 하는 상황이 생길 수 있어요.

추가로, 특정 IP에서만 SSH를 허용하고 싶다면 rich rule을 쓸 수 있어요. 예를 들어 sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="ssh" accept' 이런 식이에요. 회사 내부망에서만 접속하는 서버라면 이 방법이 훨씬 안전해요.

firewall에서 SSH 서비스가 허용된 상태
firewall에서 SSH 서비스가 허용된 상태

sshd_config 보안 설정 핵심 옵션

SSH 서버가 돌아가기 시작하면 바로 해야 할 게 sshd_config 보안 설정이에요. 기본값 그대로 두면 root 계정으로 바로 로그인이 가능하고, 비밀번호 인증도 열려 있어서 보안에 구멍이 생기거든요.

설정 파일 위치는 /etc/ssh/sshd_config예요. 수정 전에 백업부터 하세요. sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak 이거 한 줄이면 돼요. 나중에 설정을 잘못 건드려서 접속이 안 될 때, 이 백업 파일이 생명줄이에요.

Rocky 9, 10에서는 /etc/ssh/sshd_config.d/ 디렉토리에 드롭인(drop-in) 설정 파일을 넣는 방식을 권장해요. 메인 설정 파일 상단에 Include 구문이 있어서, 파일명 순서대로 읽거든요. 패키지 업그레이드 때 덮어쓰기 걱정 없이 커스텀 설정을 유지할 수 있어요.

설정 항목 권장 값 설명
PermitRootLogin no root 직접 로그인 차단
PasswordAuthentication no 키 인증 설정 후 비밀번호 차단
ClientAliveInterval 300 5분마다 keep-alive 전송
ClientAliveCountMax 2 2회 무응답 시 연결 종료
MaxAuthTries 3 로그인 시도 3회로 제한

이 설정들을 적용하려면 sudo nano /etc/ssh/sshd_config.d/01-custom.conf 파일을 만들어서 넣는 게 깔끔해요. 파일명 앞에 01을 붙이면 50-redhat.conf보다 먼저 읽히거든요. SSH 데몬은 각 설정의 첫 번째 값을 사용하니까, 이렇게 해야 커스텀 설정이 우선 적용돼요.

설정 파일을 저장한 뒤에는 반드시 sudo sshd -t로 문법 검증을 하세요. 출력이 없으면 정상이에요. 그 다음 sudo systemctl restart sshd로 재시작하면 적용되는데, 이때도 기존 세션은 유지한 채 새 터미널로 접속 테스트를 먼저 해야 해요.

SSH 키 인증 설정으로 비밀번호 없이 접속

비밀번호 인증만으로 서버를 운영하면 솔직히 불안해요. brute force 공격 한 번 당하면 auth.log가 몇 시간 만에 수만 줄씩 쌓이거든요. 키 인증을 설정하면 비밀번호 자체를 네트워크에 보내지 않으니까, 보안 수준이 완전히 달라져요.

클라이언트(내 PC)에서 키 쌍을 생성하는 것부터 시작이에요. 요즘은 Ed25519 알고리즘을 권장해요. RSA보다 키 크기가 작으면서 보안 강도는 높거든요.

ssh-keygen -t ed25519 -C "내이메일@example.com"

실행하면 저장 경로를 물어보는데 기본값(~/.ssh/id_ed25519)으로 엔터 치면 돼요. 그 다음 passphrase를 설정하라고 나오는데, 빈 값도 되지만 설정해두는 게 좋아요. 만약 개인키 파일이 유출되더라도 passphrase가 없으면 쓸 수 없거든요.

💡 꿀팁

키를 서버에 복사할 때 ssh-copy-id username@서버IP 한 줄이면 끝이에요. authorized_keys 파일 생성, 퍼미션 설정까지 자동으로 해줘요. 수동으로 하면 .ssh 디렉토리 700, authorized_keys 파일 600으로 권한을 맞춰야 하는데, ssh-copy-id를 쓰면 이런 실수를 방지할 수 있어요.

키 복사가 끝나면 ssh username@서버IP로 접속해보세요. passphrase만 입력하면(설정한 경우) 비밀번호 없이 바로 들어가져요. 이게 확인되면 그때 sshd_config에서 PasswordAuthentication no로 바꿔도 돼요.

한 가지 실수담을 공유하자면, 저는 키 인증이 잘 되는 걸 확인하고 바로 비밀번호 인증을 껐거든요. 근데 다른 PC에서 접속해야 할 일이 생겼는데 거기엔 키가 없었어요. 결국 콘솔로 들어가서 임시로 비밀번호 인증을 켜야 했어요. 모든 접속 환경에 키를 배포한 뒤에 비밀번호를 끄는 게 맞아요.

Ed25519키 쌍을 생성하는 터미널
Ed25519키 쌍을 생성하는 터미널

SSH 포트 변경과 SELinux 처리

기본 포트 22를 그대로 쓰면 자동화된 봇이 하루에도 수천 번씩 로그인을 시도해요. 포트를 바꾼다고 보안이 완벽해지는 건 아니지만, 봇 트래픽의 대부분을 걸러내는 효과가 있거든요. auth 로그가 깨끗해지니까 진짜 위협을 발견하기도 쉬워져요.

Rocky Linux에서 포트를 바꿀 때 까다로운 게 SELinux예요. 기본적으로 SELinux가 enforcing 모드로 돌아가고 있어서, sshd가 22번 외의 포트에 바인딩하려고 하면 차단해버려요. 이걸 모르고 sshd_config만 수정하면 서비스가 아예 시작이 안 돼요.

순서가 정말 중요해요. SELinux → sshd_config → firewalld, 이 순서를 지켜야 해요.

먼저 semanage 명령을 사용하려면 패키지가 필요해요. sudo dnf install policycoreutils-python-utils -y로 설치하세요. minimal 설치에서는 이것도 없거든요.

그 다음 새 포트를 SELinux에 등록해요. 예를 들어 33000번을 쓴다면 sudo semanage port -a -t ssh_port_t -p tcp 33000이에요. semanage port -l | grep ssh로 확인하면 22번과 33000번이 함께 보여야 정상이에요.

📊 실제 데이터

SSH 기본 포트 22를 사용하는 서버는 공개 인터넷에 노출될 경우 하루 평균 수천 건의 자동화된 로그인 시도를 받는다고 알려져 있어요. 포트를 비표준 번호로 변경하면 이런 자동 스캔 봇의 시도가 대폭 줄어드는 효과가 있어요. 물론 포트 스캔 자체를 완전히 막지는 못하지만, 대다수의 무차별 공격은 22번만 노리기 때문에 실질적인 방어 효과가 있어요.

SELinux 등록이 끝나면 sshd_config에서 포트를 변경하고, firewalld에 새 포트를 추가해요. 이때 22번은 바로 삭제하지 말고, 새 포트로 접속이 확인된 후에 제거하세요. sudo firewall-cmd --permanent --add-port=33000/tcpsudo firewall-cmd --reload → sshd 재시작 → 새 터미널에서 ssh -p 33000 user@서버IP로 테스트 → 성공하면 그때 22번 포트를 닫는 거예요.

fail2ban으로 무차별 대입 공격 차단하기

포트를 바꾸고 키 인증을 설정했다고 끝이 아니에요. fail2ban까지 설치해야 비로소 기본적인 SSH 보안이 완성된다고 봐요. 이 도구는 로그 파일을 실시간으로 감시하다가 일정 횟수 이상 로그인에 실패한 IP를 자동으로 차단해주거든요.

Rocky Linux에서 fail2ban은 EPEL 저장소에 있어요. sudo dnf install epel-release -y를 먼저 실행하고, sudo dnf install fail2ban -y로 설치하면 돼요.

설치 후 바로 설정 파일을 만들어야 해요. /etc/fail2ban/jail.conf를 직접 수정하면 업데이트 시 덮어써지니까, /etc/fail2ban/jail.local 파일을 새로 만드는 게 맞아요.

기본 설정 예시는 이래요. [sshd] 섹션에서 enabled = true, port = 33000(변경한 포트 번호), maxretry = 5, bantime = 3600, findtime = 600 정도면 무난해요. 10분 안에 5번 틀리면 1시간 동안 해당 IP를 차단하는 구조예요.

sudo systemctl enable --now fail2ban으로 서비스를 켜고, sudo fail2ban-client status sshd로 현재 차단 현황을 확인할 수 있어요. 제가 세팅하고 이틀 뒤에 확인해봤는데, 이미 30개 넘는 IP가 차단돼 있었어요. 포트를 바꿨는데도 그 정도니까, 기본 포트로 운영하면 얼마나 많을지 상상이 되죠.

💬 직접 써본 경험

fail2ban 세팅 초기에 bantime을 너무 짧게(300초) 잡았더니 같은 IP가 풀리자마자 다시 시도하는 게 반복됐어요. 결국 bantime을 3600초(1시간)로 올리고, recidivban(재범 차단) 설정까지 추가했더니 그때부터 확실히 줄었어요. 처음부터 bantime은 넉넉하게 잡는 걸 추천해요.

차단된 IP 목록 표시
차단된 IP 목록 표시

Q. Rocky Linux minimal 설치에서 SSH가 기본으로 깔려 있나요?

데스크톱이나 서버 전체 설치에는 포함돼 있지만, minimal 설치 이미지에서는 openssh-server가 빠져 있을 수 있어요. rpm -qa | grep openssh-server로 확인한 뒤, 없으면 dnf install openssh-server -y로 설치하면 돼요.

Q. SSH 포트를 변경했는데 접속이 안 됩니다. 뭘 확인해야 하나요?

세 가지를 순서대로 체크하세요. SELinux에 새 포트가 등록됐는지(semanage port -l | grep ssh), sshd가 새 포트에서 리스닝하는지(ss -tlnp | grep sshd), firewalld에 해당 포트가 열려 있는지(firewall-cmd --list-ports)요.

Q. Ed25519와 RSA 키 중 어떤 걸 써야 하나요?

현재 시점에서는 Ed25519를 권장해요. 키 크기가 작으면서도 보안 강도가 높고, 서명 속도도 빨라요. 다만 아주 오래된 시스템과 호환해야 한다면 RSA 4096비트를 쓰는 방법도 있어요.

Q. fail2ban에서 실수로 내 IP가 차단됐을 때 어떻게 풀 수 있나요?

콘솔이나 다른 IP로 서버에 접속한 뒤 sudo fail2ban-client set sshd unbanip 차단된IP 명령을 실행하면 즉시 해제돼요. jail.local의 ignoreip 항목에 자신의 IP를 미리 등록해두면 이런 상황을 예방할 수 있어요.

Q. sshd_config를 수정했는데 서비스가 시작이 안 됩니다.

sudo sshd -t 명령으로 설정 파일의 문법 오류를 확인하세요. 오류가 있으면 해당 줄 번호와 내용이 표시돼요. sudo journalctl -xeu sshd로 상세 로그도 볼 수 있어요. Rocky 9/10의 드롭인 설정 파일 우선순위 문제일 수도 있으니, 파일명 번호도 확인해보세요.

본 포스팅은 개인 경험과 공개 자료를 바탕으로 작성되었으며, 전문적인 의료·법률·재무 조언을 대체하지 않습니다. 정확한 정보는 해당 분야 전문가 또는 공식 기관에 확인하시기 바랍니다.

👉 함께 읽으면 좋은 글: Rocky Linux 초기 서버 세팅 체크리스트

👉 함께 읽으면 좋은 글: 리눅스 서버 모니터링 도구 비교 — Netdata vs Grafana

👉 함께 읽으면 좋은 글: firewalld 실전 설정 — 포트 관리부터 rich rule까지

Rocky Linux SSH 설정은 openssh-server 설치 → firewalld 허용 → sshd_config 보안 강화 → 키 인증 → 포트 변경 → fail2ban 순서로 진행하면 깔끔하게 끝나요. 한 번 세팅해두면 서버가 살아있는 동안 계속 효과가 있으니까, 처음에 시간을 들여서 제대로 잡아두는 게 맞아요.

서버를 처음 다루는 분이라면 키 인증과 fail2ban 설정까지는 꼭 해보세요. 비밀번호 인증만으로 서버를 운영하면 언제 뚫려도 이상하지 않거든요. 이미 서버를 운영 중인 분이라면 SELinux 포트 등록 부분이 가장 도움이 될 거예요.


궁금한 점이나 설정 중 막히는 부분이 있으면 댓글로 남겨주세요. 비슷한 서버 관리 글이 도움이 됐다면 공유도 부탁드려요.