최근에 개인 서버를 마련했다.
이 서버에 내 개인 프로젝트를 구동시킬 예정인데, 보안이 신경쓰여 내가할 수 있는 방법을 최대한 써서 보안을 강화하려고 한다.
아래의 내용을 따라하면 다음과 같은 보안적인 이점이 있다.
- SSH 포트번호 변경
- root 계정 SSH 접속 비허용
- RSA를 이용한 공개키 기반 인증
- 허용된 포트만 열어둠(UFW)
- 비정상적인 접근 차단 및 로깅(fail2ban)
- SSH 2단계 인증(2FA)
서버 환경은 Ubuntu 24.04 LTS 버전에서 이뤄졌다는점 참고 바랍니다.
SSH 포트번호 변경
ssh 설정파일을 변경해서 포트번호를 바꾸어햔다.
sudo nano /etc/ssh/sshd_config
Port 부분에 주석이되어있을 텐데 주석을 해제하고 원하는 포트번호로 바꾼다.
sudo nano /lib/systemd/system/ssh.socket
ListenStream=22 이 부분을 원하는 포트로 변경한다.
이후 변경된 내용을 적용시킨다.
sudo systemctl daemon-reload
sudo systemctl restart ssh
ssh 서비스가 재부팅 이후에도 자동 시작될 수 있도록 아래의 명령어를 실행한다.
sudo systemctl enable ssh
공개키와 개인키 설정(맥북에서)
ssh-keygen -t rsa -b 4096 -C "자신의 이메일"
Enter file in which to save the key 에는 공개키와 개인키를 저장할 경로를 지정한다.(~/.ssh/<키 이름>)
<키 이름>은 본인이 원하는 이름을 지정하면 된다.
ssh-copy-id -i ~/.ssh/<키 이름>.pub -p <ssh 포트번호> <유저명>@<서버 아이피>
키이름이 id_rsa, ssh 포트번호가 22, 유저명이 ubuntu, 서버 아이피가 123.123.123.123이라면 아래와 같다.
ssh-copy-id -i ~/.ssh/id_rsa.pub -p 22 ubuntu@123.123.123.123
ssh config 파일을 수정하여 간편하게 접속할 수 있다.
nano ~/.ssh/config
config 파일을 아래와 같이 수정해서 별명을 통해 간단히 접속할 수 있다.
Host <별명>
HostName <서버 아이피>
User <유저명>
Port <포트번호>
IdentityFile ~/.ssh/<키 이름>
별명이 server라면
ssh server
로 간편히 접속할 수 있다.
ssh 비밀번호 기반 인증 비활성화
서버의 SSH 설정 파일(/etc/ssh/sshd_config)을 수정하여 비밀번호 인증을 비활성화한다.
그리고 공개키 인증을 활성화한다.
#설정파일 1
sudo nano /etc/ssh/sshd_config
#설정파일 2
sudo nano /etc/ssh/sshd_config.d/50-cloud-init.conf
설정파일 1을 수정해서 안된다면 설정파일 2를 수정해야한다.
아래의 내용을 추가해준다.
PermitRootLogin no #root 계정으로 접속 비허용
PasswordAuthentication no #비밀번호 인증 비허용
PubkeyAuthentication yes #공개키 기반 인증 허용
나는 설정파일 1에 위 내용을 모두 적었고, 이렇게 해도 비밀번호 인증이되어서 설정 파일 2에 "PasswordAuthentication no" 만 따로 지정하였다.
설정을 저장한 후 ssh 데몬을 재시작하여 변경 사항을 적용한다.
sudo systemctl restart sshd
이렇게 설정하면 ssh로 비밀번호를 통해 접근할 수 없고 rsa 등의 추가적인 보안수단으로만 접근 가능하다.
UWF로 특정 포트만 열기
나는 일단 웹 프로젝트만 구동시킬 예정이기 때문에 ssh를 위한 22번 포트와 80, 443 포트를 제외하곤 굳이 열어둘 필요가 없다.
아래의 명령어로 설치한다.
sudo apt update
sudo apt install ufw -y
가장 먼저 22번 포트를 열어둔다.(ssh 포트를 변경했다면 다른 포트를 열어준다.)
22번 포트를 열어두지 않으면 나중에 22번 포트가 차단되어서 ssh 연결이 끊어질 수 있다.(ssh 포트를 변경했다면 다른 포트를 열어준다.)
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
특정 포트를 닫으려면 아래의 명령어를 입력한다.
sudo ufw deny <포트번호>
정밀한 제거
이 명령어를 이용하면 규칙이 가장 왼족에 숫자로 표현되며 아래의 명령어로 정밀하게 제거할 수 있다.sudo ufw status numbered
IPv4는 남겨두고 IPv6만 제거하고 싶을 때 사용한다.
sudo ufw delete <규칙 번호>
이후 ufw를 활성화한다.
sudo ufw enable
이 명령어를 실행하면 ssh가 끊어질 수 있다고 경고가 뜨는데, 22번 포트는 이미 열어두었기 때문에 y를 입력한다.
이제 아래의 명령어로 ufw에서 허용된 포트를 확인할 수 있다.
sudo ufw status verbose
fail2ban을 이용하여 비정상적인 로그인 시도 차단
Fail2Ban은 서버의 로그 파일을 모니터링하여 비정상적인 로그인 시도나 악성 트래픽을 감지하고, 해당 IP를 자동으로 차단하는 보안 도구이다. 특히 SSH와 같은 서비스에 대한 Brute Force 공격을 방어하는 데 효과적이다.
아래의 명령어로 설치한다.
sudo apt update
sudo apt install fail2ban -y
버전을 확인하여 정상적으로 설치되었는지 확인
fail2ban-client -V
그 다음 설정 파일을 열어 변경한다.
sudo nano /etc/fail2ban/jail.local
나는 이렇게 설정 파일을 변경하였다.
[DEFAULT]
# IP 차단 시간: 3600초(1시간). 이 시간 동안 차단된 IP는 서버에 접근할 수 없음.
bantime = 3600
# 실패 횟수 집계 시간: 600초(10분). 이 시간 동안 실패가 누적되어 차단 여부를 결정.
findtime = 600
# 최대 허용 실패 횟수: 5번. findtime 동안 5번 실패 시 해당 IP를 차단.
maxretry = 5
# 차단을 방지할 IP
ignoreip = 127.0.0.1/8 192.168.0.0/24
# iptables에 규칙 추가
banaction = iptables-multiport
#IPv6 차단
allowipv6 = false
[sshd]
# SSH 보호 활성화. Fail2Ban이 이 jail을 활성화하여 로그를 감시함.
enabled = true
# SSH 포트: 기본적으로 22번. 변경된 SSH 포트가 있다면 해당 번호로 수정.
port = 22
# SSH 인증 로그 파일 경로. Ubuntu의 기본 경로이며, 로그 파일을 모니터링.
logpath = /var/log/auth.log
# SSH 서비스에 적합한 필터 규칙 사용. Fail2Ban 기본 제공.
filter = sshd
# 영구 차단: 차단된 IP는 수동으로 해제하기 전까지 계속 차단.
bantime = -1
ssh 접속에 대해 특정 아이피를 차단하려면 아래의 명령어를 사용한다.
sudo fail2ban-client set sshd banip <차단할 아이피>
차단된 아이피를 해제하려면 아래의 명령어를 입력
sudo fail2ban-client unban <IP>
설정파일이 제대로 적용됐는지 확인하려면 아래의 명령어를 입력한다.
sudo fail2ban-client -t
OK: configuration test is successful 이 출력되면 정상적으로 적용된 것이다.
서비스를 재시작해야 변경 내용이 적용된다.
sudo systemctl restart fail2ban
아래의 명령어로 보호가 활성화 상태인지 확인한다.
sudo fail2ban-client status
jail이 0이 아니라 1이어야 제대로 보호되고 있는 것이다.
로그 파일 확인 및 차단 상태 확인
이 명령어로 로그 파일을 실시간으로 모니터링 할 수 있다.sudo tail -f /var/log/fail2ban.log
이 명령어로 차단된 ip 를 확인할 수 있다.sudo fail2ban-client status sshd
2FA(Two-Factor Authentication, 이중 인증) 설정(Google Authenticator)
libpam-google-authenticator 패키지는 우분투에서 2FA를 구현하는 PAM 모듈이다.
이를 설치한다.
sudo apt update
sudo apt install libpam-google-authenticator
2FA를 사용할 사용자 계정으로 로그인한 상태에서 아래의 명령어로 설정을 시작한다.
google-authenticator
실행 후 다음과 같은 질문과 옵션이 표시된다.
Do you want authentication tokens to be time-based (y/n)
- y를 입력
1. 터미널에 QR 코드가 생성된다. 스마트폰의 Google Authenticator 앱에서 스캔하거나 제공된 비밀 키를 입력한다.
- emergency scratch codes 는 백업해두는 것이 좋다.
2. “Do you want me to update your .google_authenticator file?”
- y를 입력하여 설정 파일을 저장.
3. “Do you want to disallow multiple uses of the same authentication
token? This restricts you to one login about every 30s, but it increases
your chances to notice or even prevent man-in-the-middle attacks (y/n)”
- 하나의 OTP(One-Time Password)를 여러 번 사용할 수 없도록 설정할지 묻는 것
- y를 입력하여 보안을 강화하는 것을 추천
4. “By default, a new token is generated every 30 seconds by the mobile app.
In order to compensate for possible time-skew between the client and the server,
we allow an extra token before and after the current time. This allows for a
time skew of up to 30 seconds between authentication server and client. If you
experience problems with poor time synchronization, you can increase the window
from its default size of 3 permitted codes (one previous code, the current
code, the next code) to 17 permitted codes (the 8 previous codes, the current
code, and the 8 next codes). This will permit for a time skew of up to 4 minutes
between client and server.
Do you want to do so? (y/n)”
시간 동기화가 양호한 경우
- 클라이언트와 서버의 시간이 비교적 정확히 맞춰져 있다면 기본 설정을 유지(권장).
- “Do you want to do so?“에 대해 n을 입력.
시간 동기화 문제가 발생하는 경우
- 인증 실패가 자주 발생하거나, 클라이언트와 서버의 시간이 자주 어긋나는 환경에서는 확장된 설정을 사용.
- “Do you want to do so?“에 대해 y를 입력.
5. “If the computer that you are logging into isn't hardened against brute-force
login attempts, you can enable rate-limiting for the authentication module.
By default, this limits attackers to no more than 3 login attempts every 30s.
Do you want to enable rate-limiting? (y/n)”
- 30초 동안 최대 3번의 로그인 시도만 허용하도록 할지 묻는 내용
- y를 입력하여 보안을 강화하는 것을 추천
이후 아래의 명령어를 통해서 PAM의 Google Authenticator를 활성화한다.
sudo nano /etc/pam.d/sshd
이 파일에 아무 위치에나 아래의 내용을 추가한다.
auth required pam_google_authenticator.so
SSH 데몬 설정을 수정한다
sudo nano /etc/ssh/sshd_config
아래의 내용을 추가한다.
ChallengeResponseAuthentication yes
# 또는
KbdInteractiveAuthentication yes # 키보드 대화형 인증 활성화
AuthenticationMethods publickey,keyboard-interactive # 이것은 꼭 넣어줘야 함
Ubuntu 24.04 버전 기준으로 ChallengeResponseAuthentication 옵션은 KbdInteractiveAuthentication 로 대체되었다.
때문에 둘중 확인된 하나의 옵션만 yes 로 변경해 주면 된다.
마지막으로 SSH 데몬을 다시 시작한다
sudo systemctl restart sshd
이러면 rsa키 인증 -> 계정 비밀번호 인증 -> Google Authenticator 인증 이 모두 완료되어야 접속할 수 있다.
기타
시간대 변경
sudo timedatectl set-timezone Asia/Seoul
시간대 동기화(NTP)
sudo apt update
sudo apt install chrony
'서버 구축기' 카테고리의 다른 글
[GitHub Actions] Self-Hosted Runner (0) | 2025.01.09 |
---|---|
[Ubuntu] GeoIP 를 이용한 해외 IP SSH 접속 차단 (0) | 2025.01.02 |
[Nginx] Nginx 기본 보안 설정 (1) | 2024.12.28 |
[MySQL] MySQL 보안 설정 (1) | 2024.12.27 |
[Ubuntu] 외장 SSD ext4 초기화 + 마운트 (0) | 2024.12.26 |