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
를 사용하여 리포지토리를 추가할 수 있습니다.
- sudo dnf install epel-release -y
dnf
패키지 관리자는 이제 새 소프트웨어를 설치할 때 기본 패키지 소스 외에 EPEL을 확인합니다. Fail2ban 설치를 진행합니다.
- sudo dnf install fail2ban -y
Fail2ban은 설치 후 자동으로 백그라운드 서비스를 설정합니다. 그러나 일부 기본 설정으로 인해 원하지 않는 결과가 발생할 수 있으므로 기본적으로 비활성화되어 있습니다. systemctl
명령을 사용하여 이를 확인할 수 있습니다.
- 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줄을 인쇄합니다.
- cd /etc/fail2ban
- 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
를 복사하면 됩니다.
- sudo cp jail.conf jail.local
이제 구성 변경을 시작할 수 있습니다. vi
또는 원하는 텍스트 편집기에서 파일을 엽니다.
- sudo vi jail.local
파일을 스크롤하는 동안 이 자습서에서는 업데이트할 수 있는 몇 가지 옵션을 검토합니다. 파일 상단 근처의 [DEFAULT]
섹션 아래에 있는 설정은 Fail2ban에서 지원하는 모든 서비스에 적용됩니다. 파일의 다른 곳에는 [sshd]
및 기타 서비스에 대한 헤더가 있으며 여기에는 기본값 위에 적용되는 서비스별 설정이 포함됩니다.
[DEFAULT]
. . .
bantime = 10m
. . .
bantime
매개변수는 클라이언트가 올바르게 인증하지 못한 경우 차단되는 시간을 설정합니다. 이것은 초 단위로 측정됩니다. 기본적으로 이 시간은 10분으로 설정됩니다.
[DEFAULT]
. . .
findtime = 10m
maxretry = 5
. . .
다음 두 매개변수는 findtime
및 maxretry
입니다. 이들은 함께 작동하여 클라이언트가 금지되어야 하는 불법 사용자로 밝혀지는 조건을 설정합니다.
maxretry
변수는 금지되기 전에 findtime
에 의해 정의된 시간 창 내에서 클라이언트가 인증해야 하는 시도 횟수를 설정합니다. 기본 설정을 사용하면 fail2ban 서비스는 10분 동안 5번 로그인 시도에 실패한 클라이언트를 금지합니다.
[DEFAULT]
. . .
destemail = root@localhost
sender = root@<fq-hostname>
mta = sendmail
. . .
Fail2ban이 조치를 취할 때 이메일 알림을 받아야 하는 경우 destemail
, sendername
및 mta
설정을 평가해야 합니다. destemail
매개변수는 금지 메시지를 수신해야 하는 이메일 주소를 설정합니다. sendername
은 이메일의 "보낸 사람\ 필드 값을 설정합니다. mta
매개변수는 메일을 보내는 데 사용할 메일 서비스를 구성합니다. 기본적으로 이것은 <입니다. code>sendmail이지만 Postfix 또는 다른 메일 솔루션을 사용할 수 있습니다.
[DEFAULT]
. . .
action = %(action_)s
. . .
이 매개변수는 Fail2ban이 차단을 시작하려고 할 때 취하는 조치를 구성합니다. action_
값은 파일에서 이 매개변수 바로 전에 정의됩니다. 기본 조치는 차단 시간이 경과할 때까지 위반 호스트의 트래픽을 거부하도록 방화벽 구성을 업데이트하는 것입니다.
$ (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
디렉토리에 있는 파일에 대한 참조입니다. . 이러한 파일에는 로그의 한 줄이 실패한 인증 시도인지 여부를 결정하는 정규식(텍스트 구문 분석의 일반적인 속기)이 포함되어 있습니다. 이러한 파일은 상당히 복잡하고 미리 정의된 설정이 적절한 줄과 잘 일치하기 때문에 이 가이드에서는 이러한 파일을 자세히 다루지 않을 것입니다.
그러나 해당 디렉토리를 살펴보면 어떤 종류의 필터를 사용할 수 있는지 확인할 수 있습니다.
- 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
을 실행합니다.
- sudo systemctl enable fail2ban
그런 다음 systemctl start
를 사용하여 처음으로 수동으로 시작합니다.
- sudo systemctl start fail2ban
systemctl status
로 실행 중인지 확인할 수 있습니다.
- 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를 시도하십시오. 존재하지 않는 이름을 사용하여 연결을 시도할 수 있습니다.
- ssh blah@your_server
암호 프롬프트에 임의의 문자를 입력합니다. 이것을 몇 번 반복하십시오. 어떤 시점에서 수신하는 오류는 권한 거부
에서 연결 거부
로 변경되어야 합니다. 이것은 두 번째 서버가 Fail2ban 서버에서 금지되었음을 나타냅니다.
Fail2ban 서버에서 fail2ban-client
의 출력을 확인하여 새 규칙을 볼 수 있습니다. fail2ban-client
는 실행 중인 구성을 확인하기 위해 Fail2ban에서 제공하는 추가 명령입니다.
- sudo fail2ban-client status
OutputStatus
|- Number of jail: 1
`- Jail list: sshd
fail2ban-client status sshd
를 실행하면 SSH에서 금지된 IP 목록을 볼 수 있습니다.
- sudo fail2ban-client status sshd
OutputStatus 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 서버를 보호하는 방법을 참조하세요.