SSH는 Linux 서버에 안전하게 액세스하는 데 널리 사용됩니다. 대부분의 사용자는 원격 서버에 연결할 때 기본 설정으로 SSH 연결을 사용합니다. 그러나 보안되지 않은 기본 구성은 다양한 보안 위험을 초래할 수 있습니다.

SSH 액세스가 열려 있는 서버의 루트 계정이 위험에 처할 수 있습니다. 특히 공인 IP 주소를 사용하는 경우 루트 비밀번호를 해킹하기가 훨씬 쉽습니다. 따라서 SSH 보안에 대해 알아야 합니다.

Linux에서 SSH 서버 연결을 보호하는 방법은 다음과 같습니다.

루트 사용자 로그인 비활성화

이를 위해 먼저 루트 사용자의 SSH 액세스를 비활성화하고 루트 권한이 있는 새 사용자를 만듭니다. 루트 사용자의 서버 액세스를 해제하는 것은 공격자가 시스템에 침입하려는 목적을 달성하지 못하도록 하는 방어 전략입니다. 예를 들어 다음과 같이 exampleroot라는 사용자를 만들 수 있습니다:

 useradd -m exampleroot
passwd exampleroot
usermod -aG sudo exampleroot

다음은 앞서 언급한 명령에 대한 간략한 설명입니다.

⭐ useradd는 새 사용자를 만들고 -m 매개 변수는 만든 사용자의 홈 디렉터리 아래에 폴더를 만듭니다.

⭐ passwd 명령은 새 사용자에게 비밀번호를 할당하는 데 사용됩니다. 사용자에게 할당하는 비밀번호는 복잡하고 추측하기 어려워야 한다는 점을 기억하세요.

⭐ usermod -aG sudo는 새로 만든 사용자를 관리자 그룹에 추가합니다.

사용자 생성 프로세스가 끝나면 sshd_config 파일을 약간 변경해야 합니다. 이 파일은 /etc/ssh/sshd_config에서 찾을 수 있습니다. 텍스트 편집기로 파일을 열고 다음과 같이 변경합니다:

 # Authentication: 

#LoginGraceTime 2m
PermitRootLogin no
AllowUsers exampleroot

PermitRootLogin 줄은 루트 사용자가 SSH를 사용하여 원격 액세스 권한을 얻지 못하도록 합니다. 허용 사용자 목록에 exampleroot를 포함하면 사용자에게 필요한 권한이 부여됩니다.

마지막으로 다음 명령을 사용하여 SSH 서비스를 다시 시작합니다:

 sudo systemctl restart ssh

실패하고 오류 메시지가 표시되면 아래 명령을 시도하세요. 이 명령은 사용하는 Linux 배포판에 따라 다를 수 있습니다.

 sudo systemctl restart sshd 

기본 SSH 포트 변경

기본 SSH 연결 포트는 물론 모든 공격자가 이 사실을 알고 있으므로 SSH 보안을 보장하려면 기본 포트 번호를 변경해야 합니다. 공격자는 Nmap 스캔을 통해 새 포트 번호를 쉽게 찾을 수 있지만, 여기서 목표는 공격자의 작업을 더 어렵게 만드는 것입니다.

이 글도 확인해 보세요:  크롬북에서 이모티콘을 사용하는 방법

포트 번호를 변경하려면 /etc/ssh/sshd_config를 열고 파일을 다음과 같이 변경합니다:

 Include /etc/ssh/sshd_config.d/*.conf

Port 5922

이 단계가 끝나면 sudo systemctl restart ssh를 사용하여 SSH 서비스를 다시 시작합니다. 이제 방금 정의한 포트를 사용하여 서버에 액세스할 수 있습니다.

방화벽을 사용하는 경우 방화벽에서도 필요한 규칙을 변경해야 합니다. netstat -tlpn 명령을 실행하면 SSH용 포트 번호가 변경된 것을 확인할 수 있습니다.

비밀번호가 빈 사용자의 액세스 차단

실수로 비밀번호를 만들었을 수 있는 비밀번호가 없는 사용자가 시스템에 있을 수 있습니다. 이러한 사용자가 서버에 액세스하지 못하도록 하려면 sshd_config 파일에서 PermitEmptyPasswords 줄 값을 no로 설정하면 됩니다.

 PermitEmptyPasswords no 

로그인/접속 시도 제한

기본적으로 사용자는 원하는 만큼의 비밀번호를 시도하여 서버에 액세스할 수 있습니다. 그러나 공격자는 이 취약점을 사용하여 서버를 무차별 대입할 수 있습니다.

허용되는 비밀번호 시도 횟수를 지정하여 일정 횟수 시도 후 SSH 연결을 자동으로 종료할 수 있습니다.

이를 위해 sshd_config 파일에서 MaxAuthTries 값을 변경합니다.

 MaxAuthTries 3 

SSH 버전 2 사용

첫 번째 버전에 많은 취약점이 있어 두 번째 버전의 SSH가 출시되었습니다. 기본적으로 서버가 두 번째 버전을 사용하도록 설정하려면 sshd_config 파일에 Protocol 매개변수를 추가하면 됩니다.

이렇게 하면 향후 모든 연결에서 두 번째 버전의 SSH를 사용하게 됩니다.

 Include /etc/ssh/sshd_config.d/*.conf 

Protocol 2

TCP 포트 포워딩 및 X11 포워딩 끄기

공격자는 SSH 연결을 통한 포트 포워딩으로 다른 시스템에 대한 액세스를 시도할 수 있습니다. 이를 방지하려면 sshd_config 파일에서 AllowTcpForwarding 및 X11Forwarding 기능을 해제하면 됩니다.

 X11Forwarding no 
AllowTcpForwarding no

SSH 키로 연결하기

서버에 연결하는 가장 안전한 방법 중 하나는 SSH 키를 사용하는 것입니다. SSH 키를 사용하면 비밀번호 없이 서버에 액세스할 수 있습니다. 또한 sshd_config 파일에서 비밀번호 관련 매개변수를 변경하여 서버에 대한 비밀번호 액세스를 완전히 해제할 수 있습니다.

SSH 키를 만들 때 두 개의 키가 있습니다: 공개 키와 비공개 키입니다. 공개 키는 연결하려는 서버에 업로드하고, 개인 키는 연결을 설정할 컴퓨터에 저장합니다.

컴퓨터에서 ssh-keygen 명령으로 SSH 키를 생성합니다. 비밀번호 입력란을 비워 두지 마시고 여기에 입력한 비밀번호를 기억하세요.

이 글도 확인해 보세요:  우분투에서 OpenShot 충돌을 해결하는 4가지 방법

비워두면 SSH 키 파일로만 액세스할 수 있습니다. 하지만 비밀번호를 설정하면 키 파일을 가진 공격자가 액세스하지 못하도록 차단할 수 있습니다.

예를 들어 다음 명령으로 SSH 키를 만들 수 있습니다:

 ssh-keygen 

SSH 연결에 대한 IP 제한

대부분의 경우 방화벽은 표준 프레임워크를 사용하여 액세스를 차단하며 서버를 보호하는 것을 목표로 합니다. 그러나 이것만으로는 항상 충분하지 않으며 보안 잠재력을 높여야 합니다.

이렇게 하려면 /etc/hosts.allow 파일을 엽니다. 이 파일에 추가한 내용을 통해 SSH 권한을 제한하거나, 특정 IP 차단을 허용하거나, 단일 IP를 입력하고 거부 명령으로 나머지 모든 IP 주소를 차단할 수 있습니다.

아래에서 몇 가지 샘플 설정을 확인할 수 있습니다. 이렇게 설정한 후 평소와 같이 SSH 서비스를 다시 시작하여 변경 사항을 저장합니다.

사용자 및 그룹에 대한 선택적 액세스 허용

사용자 및 그룹이 서버에 SSH로 접속하는 것을 선택적으로 허용하거나 허용하지 않도록 sshd config 파일을 구성할 수 있습니다. 기본적으로 모든 사용자와 그룹에 액세스가 허용됩니다. 적절한 권한이 있는 사용자를 제외한 다른 사람이 액세스해서는 안 되는 프로덕션 서버를 관리할 경우 보안 위험이 발생할 수 있습니다.

사용자 및 그룹에 대한 SSH 액세스를 허용/불허하기 위해 추가해야 하는 줄은 다음과 같습니다.

 AllowUsers: username sshuser@ip:port
AllowGroups: groupname
DenyUsers: username1 username2 sshuser@ip:port
DenyGroups: groupname

유휴 시간 초과 간격 설정

신뢰할 수 있는 사용자가 서버에 로그인한 상태에서 데스크톱을 방치하면 컴퓨터에 액세스할 수 있는 공격자가 이를 악용하여 서버에서 악의적인 작업을 수행할 수 있습니다.

이에 대응하는 가장 간단한 방법은 유휴 시간 초과 간격을 설정하는 것입니다. 정의된 비활성 기간이 지나면 서버는 신뢰할 수 있는 사용자가 부재하거나 비활성 상태일 때 원치 않는 액세스를 방지하기 위해 해당 사용자에 대한 SSH 연결을 종료합니다.

이 설정을 사용 설정하려면 SSHD 구성에 추가해야 하는 줄은 다음과 같습니다:

 ClientAliveInterval 120 

구성 파일에서 실행된 명령에 따라 120초 동안 활동이 없으면 연결이 종료됩니다. 원하는 대로 숫자를 변경할 수 있습니다.

경고 배너 추가

적극적인 보안 조치는 아니지만 경고 배너를 추가하는 것은 불청객을 막고 악의적인 의도로 서버에 연결하려는 공격자를 퇴장시키는 데 유용한 심리적 전술이 될 수 있습니다.

이 글도 확인해 보세요:  Linux에서 /etc/group 파일 이해하기

사용자 지정 경고 배너를 추가하려면 먼저 배너의 텍스트를 신중하게 준비하거나 인터넷에서 일반 배너 중 하나를 가져와 텍스트 파일에 저장합니다. 그런 다음 구성 파일에 이 줄을 추가합니다:

 Banner /path/to/banner/banner.txt 

강력한 MAC 알고리즘 적용

SSH의 맥락에서 MAC은 메시지 인증 코드를 의미합니다. MAC은 클라이언트와 서버 간의 데이터 전송을 확인하고 검증하는 데 사용되는 암호화 알고리즘입니다.

사이버 보안의 두 가지 핵심 요소인 데이터의 무결성과 기밀성을 보장하기 위해 강력한 MAC 알고리즘을 설정하는 것이 중요합니다. 설정에 추가해야 하는 줄은 다음과 같습니다:

 MACs hmac-sha1,hmac-sha2-256,hmac-sha2-512 

SSH 활동을 모니터링하도록 로그 수준 설정

다양한 수준의 상세도로 SSH 활동을 모니터링할 수 있습니다. 기본적으로 이 기능은 꺼져 있을 수 있습니다. 이 기능을 켜고 사용자의 오류, 메시지, 키 인증, 로그인 및 로그아웃 활동만 기록하는 기본 로깅 수준인 정보로 설정하는 것이 좋습니다.

원하는 경우 VERBOSE 또는 DEBUG와 같이 더 자세한 수준으로 변경할 수 있습니다. 다음은 sshd 구성 파일에 추가해야 하는 줄입니다:

 LogLevel INFO 

이제 SSH 서버가 기본 로깅 데이터를 생성하며, Debian/Ubuntu 기반 머신에서는 /var/log/auth.log* 파일로 이동하여 읽을 수 있고 RHEL/CentOS/Fedora에서는 /var/log/secure 파일로 이동하여 읽을 수 있습니다.

전체 로그 파일을 보고 sshd가 있는 부분으로 이동하거나, grep 명령을 사용하여 내용을 필터링하고 sshd 로그만 읽을 수 있습니다.

Linux 서버 보안의 중요성

데이터 및 데이터 보안 문제는 매우 상세하며 모든 서버 관리자가 고려해야 할 사항입니다. 서버 보안은 공격의 주요 초점이 웹 서버이고 시스템에 대한 거의 모든 정보를 포함하고 있기 때문에 매우 민감한 문제입니다.

대부분의 서버는 Linux 인프라에서 실행되므로 Linux 시스템과 서버 관리에 익숙해지는 것이 매우 중요합니다.

SSH 보안은 서버를 보호하는 방법 중 하나에 불과합니다. 공격을 중지, 차단 또는 느리게 하여 피해를 최소화할 수 있습니다. SSH 보안을 제공하는 것 외에도 Linux 서버를 보호하기 위해 구현할 수 있는 다양한 방법이 있습니다.

By 김민수

안드로이드, 서버 개발을 시작으로 여러 분야를 넘나들고 있는 풀스택(Full-stack) 개발자입니다. 오픈소스 기술과 혁신에 큰 관심을 가지고 있고, 보다 많은 사람이 기술을 통해 꿈꾸던 일을 실현하도록 돕기를 희망하고 있습니다.