어쩌다 IT
article thumbnail
반응형

 

개요

Linux 원격 접근을 위한 기본 포트는 SSH, 22번 포트이다.

기본 포트는 보안에 취약하기 때문에 임의의 포트로 변경해서 사용하라고 취약점 조치 체크리스트에 나와있다.

 

해당 내용은 KISA 한국인터넷진흥원에서 확인 가능하다.


포트 변경

1. 먼저 Linux에서 root 계정으로 접근을 하여 sshd_config 파일을 수정한다.

vi /etc/ssh/sshd_config

 

2. 해당 파일을 열어보면 내용이 ssh 관련 설정 내용들이 나와있는데 Port 부분을 찾는다.

...
# If you want to change the port on a SELinux system, you have to tell
# SELinux about this change.
# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
#
Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
...

 

3. 해당 포트를 변경하고자 하는 포트 번호로 수정한다.

# If you want to change the port on a SELinux system, you have to tell
# SELinux about this change.
# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
#
Port 30022
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::

 

4. ssh를 재시작한다.

systemctl restart sshd

번외

다행히 재시작이 되면 해당 포트로 접속을 하면 되지만,

 

Job for sshd.service failed because the control process exited with error code.
See "systemctl status sshd.service" and "journalctl -xe" for details.

 

해당 오류가 발생하는 경우도 존재한다.

 

이런 경우 조치 방법은 여러 가지가 있다.

 

SELinux 허용모드

SELinux는 Secure Enhanced Linux의 약자로 리눅스의 취약점을 보완하기 위한 것이라고 생각하면 된다.

 

보안은 취약할수록 사용자가 편하다.

보안은 강력할수록 사용자가 불편하다. 

 

먼저 SELinux를 허용모드로 변경시키는 방법이다.

 

1. getenforce 명령으로 SELinux의 상태를 확인한다.

getenforce

Enforcing이라고 나온다면 SELinux가 강제모드로 활성화되어 있는 상태이다.

이를 허용모드로 바꾸고 ssh를 재시작하면 된다.

 

2. SELinux 허용모드로 변경

setenforce 0

해당 명령어를 통해 SELinux를 비활성화하고 난 이후 상태를 확인하면

Permissive, 허용모드로 확인된다.

 

3. ssh를 시작한다.

systemctl start sshd

 

위와 같이 SELinux 모드를 변경하여 ssh를 실행시키는 방법이 있고, 다른 방법이 있다.


ssh 허용 포트 추가

SELinux 모드는 변경하지 않고 ssh를 실행시키기 위해서는 변경한 포트를 추가해주어야 한다.

 

1. 오픈되어 있는 ssh 포트 확인

semanage port -l | grep ssh

해당 명령어를 통해 확인을 해보면

ssh_port_t        tcp        22

라는 문구를 확인할 수 있는데, 이곳에 우리는 변경한 포트를 추가해주어야 한다.

 

2. 변경한 포트 추가

semanage port -a -t ssh_port_t -p tcp 30022

이 문구 낯이 익다고 생각한 분들이라면

sshd_config, sshd 설정 파일 수정 시에 그 부분을 조금이라도 관심 있게 본 분들이다.

포트를 수정했던 바로 위에 있던 것이기 때문이다.

 

3. ssh를 시작한다.

systemctl start sshd

그 외의 경우

이렇게 했는데도 ssh가 실행되지 않는 경우가 있다.

내가 이 포스팅을 쓰게 된 계기가 바로 이 문제 때문이었다.

 

SELinux의 모드를 변경해도, semanage를 통한 포트를 추가해도, 별 짓을 다해도,

 

Job for sshd.service failed because the control process exited with error code.
See "systemctl status sshd.service" and "journalctl -xe" for details.

 

해당 에러가 발생하면서 ssh가 실행되지 않았다.

 

이도 저도 안되니 로그를 확인해보아야 하겠다.

 

1. ssh log 조회

journalctl -u sshd.service | tail -n 100

 

2. log 내용 확인

 2월 28 11:11:12 localhost.localdomain sshd[4230]: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 2월 28 11:11:12 localhost.localdomain sshd[4230]: @         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
 2월 28 11:11:12 localhost.localdomain sshd[4230]: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 2월 28 11:11:12 localhost.localdomain sshd[4230]: Permissions 0626 for '/etc/ssh/ssh_host_ed25519_key' are too open.
 2월 28 11:11:12 localhost.localdomain sshd[4230]: It is required that your private key files are NOT accessible by others.
 2월 28 11:11:12 localhost.localdomain sshd[4230]: This private key will be ignored.
 2월 28 11:11:12 localhost.localdomain sshd[4230]: Unable to load host key "/etc/ssh/ssh_host_ed25519_key": bad permissions
 2월 28 11:11:12 localhost.localdomain sshd[4230]: Unable to load host key: /etc/ssh/ssh_host_ed25519_key
 2월 28 11:11:12 localhost.localdomain sshd[4230]: sshd: no hostkeys available -- exiting.
 2월 28 11:11:12 localhost.localdomain systemd[1]: sshd.service: Main process exited, code=exited, status=1/FAILURE
 2월 28 11:11:12 localhost.localdomain systemd[1]: sshd.service: Failed with result 'exit-code'.
 2월 28 11:11:12 localhost.localdomain systemd[1]: Failed to start OpenSSH server daemon.

 

해당 내용에서 눈여겨 봐야 할 곳은 4번째 줄,

Permissions 0624 for '/{key_name}' are too open.

이라는 문구이다.

 

잘 사용하던 서버였는데 어떠한 문제로 갑자기 ssh가 접속이 되지 않는 문제였고,

/etc의 권한을 잘못변경했다가 원복 시킨 이후에 해당 문제가 발생했다.

 

3. key 권한을 먼저 확인해본다.

ls -l /etc/ssh/
-rw-r--r--. 1 root root     577388  8월  2  2023 moduli
-rw-r--r--. 1 root root       1770  8월  2  2023 ssh_config
drwxr-xr-x. 2 root root         28  1월 30 23:20 ssh_config.d
-rw-rw-rw-. 1 root ssh_keys    480  1월 30 23:44 ssh_host_ecdsa_key
-rw-r--r--. 1 root root        162  1월 30 23:44 ssh_host_ecdsa_key.pub
-rw-rw-rw-. 1 root ssh_keys    387  1월 30 23:44 ssh_host_ed25519_key
-rw-r--r--. 1 root root         82  1월 30 23:44 ssh_host_ed25519_key.pub
-rw-rw-rw-. 1 root ssh_keys   2578  1월 30 23:44 ssh_host_rsa_key
-rw-r--r--. 1 root root        554  1월 30 23:44 ssh_host_rsa_key.pub
-rw-------. 1 root root       4269  2월 28 10:37 sshd_config

 

위의 키의 권한은 임의로 666으로 설정하고 테스트했다.

초기의 키 권한은 640으로 설정되어 있는데 해당 키들의 권한을 변경하면 된다.

 

4. key 권한 변경 및 ssh 실행

chmod 640 /etc/ssh/ssh_host_ecdsa_key
chmod 640 /etc/ssh/ssh_host_ed25519_key
chmod 640 /etc/ssh/ssh_host_rsa_key
systemctl start sshd

 

키의 권한을 변경한 후에 ssh를 실행하면 정상적으로 실행됨을 확인할 수 있다.

 

systemctl status sshd
● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2024-02-28 11:21:46 KST; 38s ago
     Docs: man:sshd(8)
           man:sshd_config(5)
 Main PID: 4456 (sshd)
    Tasks: 1 (limit: 22798)
   Memory: 1.1M
   CGroup: /system.slice/sshd.service
           └─4456 /usr/sbin/sshd -D -oCiphers=aes256-gcm@openssh.com,chacha20-poly1305@openssh.com,aes256-ctr,aes256-cbc,aes>

 2월 28 11:21:46 localhost.localdomain systemd[1]: Starting OpenSSH server daemon...
 2월 28 11:21:46 localhost.localdomain sshd[4456]: Server listening on 0.0.0.0 port 30022.
 2월 28 11:21:46 localhost.localdomain sshd[4456]: Server listening on :: port 30022.
 2월 28 11:21:46 localhost.localdomain systemd[1]: Started OpenSSH server daemon.

정리

리눅스를 사용하다보면 당연히 되야하는 것들이 안되는 경우를 종종 마주한다.

처음에는 아는 선에서 해결해보려고 하다가 도달하는 곳은 결국 구글링인 것 같다.

 

어찌되었든, ssh 포트 변경이나 journalctl에 막힌 사람들,

무엇보다 추후에 까먹을 나를 위한 리눅스 ssh 포트 변경 포스팅을 마친다.

 

 

반응형
profile

어쩌다 IT

@jwlish

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!