인터넷 상에 올라와 있는 서버니까 아무래도 해킹의 우려가 있다. 물론 호스팅 업체(AWS, iwinv 등)에서 운영하는 방화벽이 있으니까 어느정도는 보호가 되긴하지만... 나도 스스로 보안 상의 허점을 남겨둘 이유는 딱히 없으니... 그것부터 하자.
참고) 명령어 앞에
#
문자가 있는 경우에는root
로 실행한 것,$
문자가 있는 경우에는ubuntu
계정으로 실행한 경우이다.
작업 전 설정파일을 백업해두는 것은 선택이 아닌 필수!😉
# cp /etc/ssh/sshd_config /etc/ssh/sshd_config_20210815
보통 내 경우에는 원본 파일명_날짜
형태로 동일경로에 백업해둔다. 이렇게 백업해둔 설정파일은 설정 변경 후 문제가 생기면 원상복구 할 때 사용하기도 하고, 변경내용을 확인할 때 사용한다.
22번 포트는 ssh에서 기본포트(wellknown port)이므로 가능하면 다른 번호로 변경해주는 것이 좋다.
# vi /etc/ssh/sshd_config
설정파일 앞에 있는 주석표기인 #
문자를 지우고 22
를 122
로 변경한다.
# diff /etc/ssh/sshd_config_20210815 /etc/ssh/sshd_config 15c15 < #Port 22 --- Port 122 #
포트번호를 바꾸고 싶었지만... iwinv에서 제공하는 방화벽 설정을 찾을 수 없어서 포트번호는 원상복구를 했다.😨
# cat /etc/ssh/sshd_config | grep ClientAlive #ClientAliveInterval 0 #ClientAliveCountMax 3
기본적으로 설정되어 있는 것을 보니 세션을 자동으로 종료하지 않도록 설정되어 있다. 참고한 문서에 나와있는대로 30분으로 설정한다.
# vi /etc/ssh/sshd_config # cat /etc/ssh/sshd_config | grep ClientAlive ClientAliveInterval 600 ClientAliveCountMax 3 # diff /etc/ssh/sshd_config_20210815 /etc/ssh/sshd_config 15c15 < #Port 22 --- Port 10022 100,101c100,101 < #ClientAliveInterval 0 < #ClientAliveCountMax 3 --- ClientAliveInterval 600 ClientAliveCountMax 3 #
자동으로 로그아웃되면 불편할 때도 있지만... 보통은 불편함이 늘어나는 만큼 보안이 강화되는 경향이 있다.
리눅스 시스템에서 가장 최상위 계정은 root 계정이다. 보통은 root 계정을 확보하면 해당 서버의 모든 작업을 수행할 수 있다.(간혹 커널레벨에 보안솔루션이 설치된 경우에는 root 권한을 제한할 수 있는 경우도 있긴하다.) 그래서 해커들은 주 목표 중에 하나가 root 계정을 확보(=탈취)하는 것이다.
서버의 원격접속에 사용하는 ssh에서 root 로그인을 불가하게 하려면, 일단은 root로 권한 상승이 가능한 일반 계정을 확보해야한다.
# cat /etc/passwd | grep ubuntu ubuntu:x:1000:1000:Ubuntu:/home/ubuntu:/bin/bash # cat /etc/group | grep ubuntu adm:x:4:syslog,ubuntu dialout:x:20:ubuntu cdrom:x:24:ubuntu floppy:x:25:ubuntu sudo:x:27:ubuntu audio:x:29:ubuntu dip:x:30:ubuntu video:x:44:ubuntu plugdev:x:46:ubuntu netdev:x:117:ubuntu lxd:x:118:ubuntu ubuntu:x:1000: #
아마도 호스팅 업체에서 가상서버용 OS 이미지를 생성할 때 ubuntu
라는 계정을 관리자 권한으로 생성한 듯하다.(AWS도 배포판 이름으로 관리자계정을 만들더라)
# cat /etc/sudoers | grep % %admin ALL=(ALL) ALL %sudo ALL=(ALL:ALL) ALL #
/etc/sudoers
파일을 보니 admin
, sudo
그룹에 포함되어 있는 사용자면 sudo 명령어를 이용해서 root 권한을 일시적으로 획득할 수 있다.
다행이... ubuntu라는 계정이 sudo 권한이 있는 것을 확인했다.
앞으로는 서버에 ubuntu 계정으로 로그인 할 예정이니 ubuntu 계정의 비밀번호를 바꿔야한다.
# passwd ubuntu New password: Retype new password: passwd: password updated successfully # su - ubuntu To run a command as administrator (user "root"), use "sudo <command>". See "man sudo_root" for details. $ sudo ls / bin boot dev etc home lib lib32 lib64 libx32 lost+found media mnt opt proc root run sbin snap srv sys tmp usr var $
비밀번호를 바꾸고 sudo 명령어를 실행해서 정상적으로 수행되나 확인한다.
ubuntu 계정으로 로그인을 해서 테스트한다. 정상적으로 로그인이 되었으면 다음 단계로 gogo!😎
$ sudo vi /etc/ssh/sshd_config $ cat /etc/ssh/sshd_config | grep PermitRootLogin PermitRootLogin no # the setting of "PermitRootLogin without-password". $
간혹가다가 특정 애플리케이션을 설치하기 위해서 계정을 생성하고 비밀번호는 id와 동일하게 만들거나 아예 지정을 안하는 경우가 있다. 이런 계정으로 ssh 로그인을 불가하도록 처리한다.
$ cat /etc/ssh/sshd_config | grep PermitEmpty #PermitEmptyPasswords no $
현재 설정은 그런 계정도 로그인을 허용하고 있으니 해당 설정의 #
주석문서를 지워서 비밀번호 없는 계정에 대해서 로그인 불가하도록 처리한다.
$ cat /etc/ssh/sshd_config | grep PermitEmpty PermitEmptyPasswords no $
설정파일 적용
이제 설정을 완료했으니 ssh 데몬을 재기동하여 설정을 적용한다.
$ sudo systemctl restart ssh
설정이 정상적으로 됬는지 확인을 위해서 root 계정으로 로그인을 시도해본다.
login as: root root@iwinv-dokuwiki's password: Access denied root@iwinv-dokuwiki's password:
비밀번호를 정상적으로 입력했음에도 Access denied
로 뜨는 것을 보니 정상적으로 설정이 적용되었음을 확인할 수 있다.
방화벽 이슈로 적용에 실패했지만.. 포트번호가 변경된 것을 확인하고 싶으면 아래의 명령어로 확인해본다.
$ sudo netstat -an | grep LIST | grep :22 tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp6 0 0 :::22 :::* LISTEN $
위의 :22
부분을 변경한 포트번호로 바꿔서 정상적으로 조회되면 잘 바뀐 것이다.
설정파일 변경작업은 금방 완료했는데.. iwinv의 방화벽에서 헤매서 한참 걸린거 같다. ssh 기본포트 변경작업은 나중에 방화벽 이슈를 확인해보고 다시 해볼 생각이다.