웹사이트 검색

Rocky Linux 9에서 Fail2Ban으로 SSH를 보호하는 방법


소개

SSH는 사실상 클라우드 서버에 연결하는 방법입니다. 내구성이 뛰어나고 확장 가능합니다. 새로운 암호화 표준이 개발됨에 따라 새로운 SSH 키를 생성하는 데 사용할 수 있으므로 핵심 프로토콜이 안전하게 유지됩니다. 그러나 어떤 프로토콜이나 소프트웨어 스택도 완벽하지 않으며 SSH가 인터넷을 통해 광범위하게 배포된다는 것은 SSH가 사람들이 통과할 수 있는 매우 예측 가능한 공격면 또는 공격 벡터를 나타낸다는 것을 의미합니다. 액세스 권한을 얻으십시오.

네트워크에 노출된 모든 서비스는 이러한 방식으로 잠재적인 대상이 됩니다. 광범위하게 트래피킹되는 서버에서 실행되는 SSH 서비스의 로그를 검토하면 사용자와 봇 모두에 의한 무차별 대입 공격을 나타내는 반복적이고 체계적인 로그인 시도를 자주 볼 수 있습니다. SSH 서비스를 일부 최적화하여 SSH 키를 위해 암호 인증을 비활성화하는 것과 같이 이러한 공격이 성공할 가능성을 거의 0에 가깝게 줄일 수 있지만 여전히 사소하고 지속적인 책임을 질 수 있습니다.

이 책임을 완전히 받아들일 수 없는 대규모 프로덕션 배포는 일반적으로 SSH 서비스 앞에 WireGuard와 같은 VPN을 구현하므로 추가 소프트웨어 추상화 또는 추가 없이 외부 인터넷에서 기본 SSH 포트 22에 직접 연결할 수 없습니다. 게이트웨이. 이러한 VPN 솔루션은 널리 신뢰되지만 복잡성이 추가되고 일부 자동화 또는 기타 작은 소프트웨어 후크가 손상될 수 있습니다.

전체 VPN 설정을 커밋하기 전에 또는 추가로 Fail2ban이라는 도구를 구현할 수 있습니다. Fail2ban은 특정 횟수의 로그인 시도 실패 후 특정 IP를 금지하도록 방화벽 구성을 자동으로 변경하는 규칙을 생성하여 무차별 암호 대입 공격을 상당히 완화할 수 있습니다. 이렇게 하면 서버가 사용자의 개입 없이 이러한 액세스 시도에 대해 스스로를 강화할 수 있습니다.

이 가이드에서는 Rocky Linux 9 서버에서 Fail2ban을 설치하고 사용하는 방법을 설명합니다.

전제 조건

이 가이드를 완료하려면 다음이 필요합니다.

  • Rocky Linux 9 서버 및 sudo 권한이 있는 루트가 아닌 사용자. Rocky Linux 9 가이드로 초기 서버 설정에서 이러한 권한을 가진 사용자를 설정하는 방법에 대해 자세히 알아볼 수 있습니다. 또한 초기 서버 설정 가이드에서 다루는 firewalld가 서버에서 실행 중이어야 합니다.\n
  • 선택적으로 첫 번째 서버에 연결할 수 있는 두 번째 서버로 의도적으로 차단되는지 테스트하는 데 사용할 수 있습니다.\n

1단계 - Fail2ban 설치

Fail2ban은 Rocky의 기본 소프트웨어 리포지토리에서 사용할 수 없습니다. 그러나 Red Hat 및 Rocky Linux의 타사 패키지에 일반적으로 사용되는 EPEL 또는 Enterprise Linux용 고급 패키지 리포지토리에서 사용할 수 있습니다. EPEL을 시스템 패키지 소스에 아직 추가하지 않은 경우 다른 패키지를 설치하는 것처럼 dnf를 사용하여 리포지토리를 추가할 수 있습니다.

  1. sudo dnf install epel-release -y

dnf 패키지 관리자는 이제 새 소프트웨어를 설치할 때 기본 패키지 소스 외에 EPEL을 확인합니다. Fail2ban 설치를 진행합니다.

  1. sudo dnf install fail2ban -y

Fail2ban은 설치 후 자동으로 백그라운드 서비스를 설정합니다. 그러나 일부 기본 설정으로 인해 원하지 않는 결과가 발생할 수 있으므로 기본적으로 비활성화되어 있습니다. systemctl 명령을 사용하여 이를 확인할 수 있습니다.

  1. systemctl status fail2ban.service
Output
○ fail2ban.service - Fail2Ban Service Loaded: loaded (/lib/systemd/system/fail2ban.service; disabled; vendor preset: disabled Active: inactive (dead) Docs: man:fail2ban(1)

Fail2ban을 즉시 활성화할 수 있지만 먼저 일부 기능을 검토합니다.

2단계 – Fail2ban 구성

fail2ban 서비스는 구성 파일을 /etc/fail2ban 디렉토리에 보관합니다. jail.conf라는 기본값이 있는 파일이 있습니다. 해당 디렉토리로 이동하여 head -20을 사용하여 해당 파일의 처음 20줄을 인쇄합니다.

  1. cd /etc/fail2ban
  2. head -20 jail.conf
Output
# # WARNING: heavily refactored in 0.9.0 release. Please review and # customize settings for your setup. # # Changes: in most of the cases you should not modify this # file, but provide customizations in jail.local file, # or separate .conf files under jail.d/ directory, e.g.: # # HOW TO ACTIVATE JAILS: # # YOU SHOULD NOT MODIFY THIS FILE. # # It will probably be overwritten or improved in a distribution update. # # Provide customizations in a jail.local file or a jail.d/customisation.local. # For example to change the default bantime for all jails and to enable the # ssh-iptables jail the following (uncommented) would appear in the .local file. # See man 5 jail.conf for details. # # [DEFAULT]

보시다시피 이 파일의 처음 몇 줄은 주석 처리되어 있습니다. 설정이 아닌 문서로 읽어야 함을 나타내는 # 문자로 시작합니다. 보시다시피 이 주석은 이 파일을 직접 수정하지 말라고 지시하고 있습니다. 대신 두 가지 옵션이 있습니다. jail.d/ 디렉토리 내의 여러 파일에서 Fail2ban에 대한 개별 프로필을 만들거나 jail.local에서 모든 로컬 설정을 만들고 수집합니다. 코드> 파일입니다. jail.conf 파일은 Fail2ban 자체가 업데이트될 때 주기적으로 업데이트되며 재정의를 생성하지 않은 기본 설정의 소스로 사용됩니다.

이 자습서에서는 jail.local을 만듭니다. jail.conf를 복사하면 됩니다.

  1. sudo cp jail.conf jail.local

이제 구성 변경을 시작할 수 있습니다. vi 또는 원하는 텍스트 편집기에서 파일을 엽니다.

  1. sudo vi jail.local

파일을 스크롤하는 동안 이 자습서에서는 업데이트할 수 있는 몇 가지 옵션을 검토합니다. 파일 상단 근처의 [DEFAULT] 섹션 아래에 있는 설정은 Fail2ban에서 지원하는 모든 서비스에 적용됩니다. 파일의 다른 곳에는 [sshd] 및 기타 서비스에 대한 헤더가 있으며 여기에는 기본값 위에 적용되는 서비스별 설정이 포함됩니다.

[DEFAULT]
. . .
bantime = 10m
. . .

bantime 매개변수는 클라이언트가 올바르게 인증하지 못한 경우 차단되는 시간을 설정합니다. 이것은 초 단위로 측정됩니다. 기본적으로 이 시간은 10분으로 설정됩니다.

[DEFAULT]
. . .
findtime = 10m
maxretry = 5
. . .

다음 두 매개변수는 findtimemaxretry입니다. 이들은 함께 작동하여 클라이언트가 금지되어야 하는 불법 사용자로 밝혀지는 조건을 설정합니다.

maxretry 변수는 금지되기 전에 findtime에 의해 정의된 시간 창 내에서 클라이언트가 인증해야 하는 시도 횟수를 설정합니다. 기본 설정을 사용하면 fail2ban 서비스는 10분 동안 5번 로그인 시도에 실패한 클라이언트를 금지합니다.

[DEFAULT]
. . .
destemail = root@localhost
sender = root@<fq-hostname>
mta = sendmail
. . .

Fail2ban이 조치를 취할 때 이메일 알림을 받아야 하는 경우 destemail, sendernamemta 설정을 평가해야 합니다. destemail 매개변수는 금지 메시지를 수신해야 하는 이메일 주소를 설정합니다. sendername은 이메일의 "보낸 사람\ 필드 값을 설정합니다. mta 매개변수는 메일을 보내는 데 사용할 메일 서비스를 구성합니다. 기본적으로 이것은 <입니다.sendmail이지만 Postfix 또는 다른 메일 솔루션을 사용할 수 있습니다.

[DEFAULT]
. . .
action = %(action_)s
. . .

이 매개변수는 Fail2ban이 차단을 시작하려고 할 때 취하는 조치를 구성합니다. action_ 값은 파일에서 이 매개변수 바로 전에 정의됩니다. 기본 조치는 차단 시간이 경과할 때까지 위반 호스트의 트래픽을 거부하도록 방화벽 구성을 업데이트하는 것입니다.

&#36 (action_)를 위와 교체할 수 있는 다른 action_ 스크립트가 기본적으로 제공됩니다.

…
# ban & send an e-mail with whois report to the destemail.
action_mw = %(action_)s
            %(mta)s-whois[sender="%(sender)s", dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]

# ban & send an e-mail with whois report and relevant log lines
# to the destemail.
action_mwl = %(action_)s
             %(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]

# See the IMPORTANT note in action.d/xarf-login-attack for when to use this action
#
# ban & send a xarf e-mail to abuse contact of IP address and include relevant log lines
# to the destemail.
action_xarf = %(action_)s
             xarf-login-attack[service=%(__name__)s, sender="%(sender)s", logpath="%(logpath)s", port="%(port)s"]

# ban IP on CloudFlare & send an e-mail with whois report and relevant log lines
# to the destemail.
action_cf_mwl = cloudflare[cfuser="%(cfemail)s", cftoken="%(cfapikey)s"]
                %(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]
…

예를 들어, action_mw는 작업을 수행하고 이메일을 보내고, action_mwl은 작업을 수행하고, 이메일을 보내고, 로깅을 포함하고, action_cf_mwl은 모든 작업을 수행합니다. 위반자를 차단하기 위해 계정과 연결된 Cloudflare API에 대한 업데이트를 보내는 것 외에도 위의 내용을 포함합니다.

개별 감옥 설정

다음은 개별 서비스를 다루는 구성 파일 부분입니다. 이들은 [sshd]와 같은 섹션 헤더로 지정됩니다.

이러한 각 섹션은 다른 설정과 함께 헤더 아래에 enabled = true 줄을 추가하여 개별적으로 활성화해야 합니다.

[jail_to_enable]
. . .
enabled = true
. . .

이 자습서에서는 SSH 감옥을 활성화합니다. 개별 감옥 설정의 맨 위에 있어야 합니다. 그렇지 않으면 기본 매개변수가 작동하지만 [sshd] 헤더 아래에 enabled = true라는 구성 줄을 추가해야 합니다.

#
# JAILS
#

#
# SSH servers
#

[sshd]

# To use more aggressive sshd modes set filter parameter "mode" in jail.local:
# normal (default), ddos, extra or aggressive (combines all).
# See "tests/files/logs/sshd" or "filter.d/sshd.conf" for usage example and details.
#mode   = normal
enabled = true
port    = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s

여기에 설정된 다른 설정으로는 로그의 한 줄이 인증 실패를 나타내는지 여부를 결정하는 데 사용되는 필터와 fail2ban에 대한 로그가 어디에 있는지 알려주는 logpath가 있습니다. 특정 서비스가 있습니다.

filter 값은 실제로 .conf 확장자가 제거된 /etc/fail2ban/filter.d 디렉토리에 있는 파일에 대한 참조입니다. . 이러한 파일에는 로그의 한 줄이 실패한 인증 시도인지 여부를 결정하는 정규식(텍스트 구문 분석의 일반적인 속기)이 포함되어 있습니다. 이러한 파일은 상당히 복잡하고 미리 정의된 설정이 적절한 줄과 잘 일치하기 때문에 이 가이드에서는 이러한 파일을 자세히 다루지 않을 것입니다.

그러나 해당 디렉토리를 살펴보면 어떤 종류의 필터를 사용할 수 있는지 확인할 수 있습니다.

  1. ls /etc/fail2ban/filter.d

사용 중인 서비스와 관련이 있어 보이는 파일이 있으면 텍스트 편집기로 열어야 합니다. 대부분의 파일은 상당히 잘 설명되어 있으며 적어도 스크립트가 보호하도록 설계된 조건 유형을 알 수 있어야 합니다. 대부분의 이러한 필터에는 jail.conf 파일에 적절한(비활성화) 섹션이 있으며 원하는 경우 jail.local 파일에서 활성화할 수 있습니다.

예를 들어 Nginx를 사용하여 웹 사이트를 제공하고 있는데 사이트의 암호로 보호된 부분이 로그인 시도로 인해 차단되고 있다는 사실을 깨달았다고 상상해 보십시오. fail2ban에게 nginx-http-auth.conf 파일을 사용하여 /var/log/nginx/error.log 파일 내에서 이 조건을 확인하도록 지시할 수 있습니다.

이것은 실제로 /etc/fail2ban/jail.conf 파일의 [nginx-http-auth] 섹션에 이미 설정되어 있습니다. enabled 매개변수를 추가하기만 하면 됩니다.

. . .
[nginx-http-auth]

enabled = true
. . .

편집이 끝나면 파일을 저장하고 닫습니다. vi를 사용하는 경우 :x를 사용하여 저장하고 종료합니다. 이 시점에서 지금부터 자동으로 실행되도록 Fail2ban 서비스를 활성화할 수 있습니다. 먼저 systemctl enable을 실행합니다.

  1. sudo systemctl enable fail2ban

그런 다음 systemctl start를 사용하여 처음으로 수동으로 시작합니다.

  1. sudo systemctl start fail2ban

systemctl status로 실행 중인지 확인할 수 있습니다.

  1. sudo systemctl status fail2ban
Output
● fail2ban.service - Fail2Ban Service Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: disabled Active: active (running) since Wed 2022-09-14 20:48:40 UTC; 2s ago Docs: man:fail2ban(1) Main PID: 39396 (fail2ban-server) Tasks: 5 (limit: 1119) Memory: 12.9M CPU: 278ms CGroup: /system.slice/fail2ban.service └─39396 /usr/bin/python3.6 -s /usr/bin/fail2ban-server -xf start Sep 14 20:48:40 rocky9-tester systemd[1]: Starting Fail2Ban Service... Sep 14 20:48:40 rocky9-tester systemd[1]: Started Fail2Ban Service. Sep 14 20:48:41 rocky9-tester fail2ban-server[39396]: Server ready

다음 단계에서는 Fail2ban의 작동을 시연합니다.

3단계 - 차단 정책 테스트(선택 사항)

앞으로 Fail2ban 서버에 로그인할 필요가 없는 다른 서버에서 두 번째 서버를 차단하여 규칙을 테스트할 수 있습니다. 두 번째 서버에 로그인한 후 Fail2ban 서버에 SSH를 시도하십시오. 존재하지 않는 이름을 사용하여 연결을 시도할 수 있습니다.

  1. ssh blah@your_server

암호 프롬프트에 임의의 문자를 입력합니다. 이것을 몇 번 반복하십시오. 어떤 시점에서 수신하는 오류는 권한 거부에서 연결 거부로 변경되어야 합니다. 이것은 두 번째 서버가 Fail2ban 서버에서 금지되었음을 나타냅니다.

Fail2ban 서버에서 fail2ban-client의 출력을 확인하여 새 규칙을 볼 수 있습니다. fail2ban-client는 실행 중인 구성을 확인하기 위해 Fail2ban에서 제공하는 추가 명령입니다.

  1. sudo fail2ban-client status
Output
Status |- Number of jail: 1 `- Jail list: sshd

fail2ban-client status sshd를 실행하면 SSH에서 금지된 IP 목록을 볼 수 있습니다.

  1. sudo fail2ban-client status sshd
Output
Status for the jail: sshd |- Filter | |- Currently failed: 2 | |- Total failed: 7 | `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd `- Actions |- Currently banned: 1 |- Total banned: 1 `- Banned IP list: 134.209.165.184

금지된 IP 목록 내용은 두 번째 서버의 IP 주소를 반영해야 합니다.

결론

이제 서비스에 대한 일부 금지 정책을 구성할 수 있습니다. Fail2ban은 인증을 사용하는 모든 종류의 서비스를 보호하는 유용한 방법입니다. fail2ban 작동 방식에 대해 자세히 알아보려면 fail2ban 규칙 및 파일 작동 방식에 대한 자습서를 확인하십시오.

fail2ban을 사용하여 다른 서비스를 보호하는 방법에 대한 자세한 내용은 Fail2Ban으로 Nginx 서버를 보호하는 방법을 참조하세요.