πŸ ν™ˆμ„œλ²„ λ§Œλ“€κΈ°πŸ  λ³΄μ•ˆ

μƒˆμ–‘Β·2021λ…„ 3μ›” 7일
5

ν™ˆμ„œλ²„ λ§Œλ“€κΈ°

λͺ©λ‘ 보기
4/12
post-thumbnail

μ—…λ°μ΄νŠΈ


μ—…λ°μ΄νŠΈλŠ” κ°€μž₯ μ€‘μš”ν•©λ‹ˆλ‹€.
ν™ˆμ„œλ²„μ— μ„€μΉ˜λœ μ„œλΉ„μŠ€λ“€μ˜ κΈ°λŠ₯ κ°œμ„  μ—…λ°μ΄νŠΈλ„ μžˆκ² μ§€λ§Œ μš°λΆ„νˆ¬ μ‹œμŠ€ν…œ λ‚΄λΆ€ λ³΄μ•ˆ μ—…λ°μ΄νŠΈμ™€ μ„œλΉ„λ“€μ˜ λ³΄μ•ˆ μ—…λ°μ΄νŠΈλ„ μžˆμ„ 수 μžˆκΈ°μ— ν•œλ²ˆμ— SSH 접속을 ν–ˆμ„ λ•Œ μ—…λ°μ΄νŠΈκ°€ μžˆλ‹€κ³  ν•˜λ©΄ λ°”λ‘œλ°”λ‘œ ν•΄μ£Όμ‹œλŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

sudo apt update && sudo apt upgrade -y

μ—…λ°μ΄νŠΈ ν›„ 가끔 *** System restart required *** 메세지가 보일 수 μžˆλŠ”λ° 이땐 μ•„λž˜ λͺ…λ Ήμ–΄λ₯Ό 톡해 ν™ˆμ„œλ²„λ₯Ό μž¬μ‹œμž‘ 해주도둝 ν•©μ‹œλ‹€.

sudo reboot




root 계정 λΉ„λ°€λ²ˆν˜Έ 생성


μš°λΆ„νˆ¬ μ„€μΉ˜ ν›„ 졜고 κΆŒν•œμ„ κ°€μ§ˆ 수 μžˆλŠ” root κ³„μ •μ˜ λΉ„λ°€λ²ˆν˜Έλ₯Ό 졜초 1번 μ„€μ • ν•΄μ€˜μ•Ό ν•©λ‹ˆλ‹€.

μ•„λž˜ λͺ…λ Ήμ–΄λ₯Ό μž…λ ₯ν•œ λ’€ 상황에 맞게 ν–‰λ™ν•˜λ©΄ λ©λ‹ˆλ‹€.

sudo passwd

ν˜Ήμ‹œ [sudo] password for [user]: 와 λΉ„μŠ·ν•œ 문ꡬ가 뜨면 sudo λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•œ 인증 κ³Όμ •μœΌλ‘œ μ‚¬μš©μž κ³„μ •μ˜ λΉ„λ°€λ²ˆν˜Έλ₯Ό μž…λ ₯ν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€.
μœ„ 문ꡬ가 보이지 μ•ŠλŠ”λ‹€λ©΄ μ•„λž˜μ˜ λΉ„λ°€λ²ˆν˜Έ μ„€μ • 뢀뢄을 μ­‰ ν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€.

λ‹€μŒκ³Ό 같은 문ꡬ가 보인닀면 μ‚¬μš©ν•  root κ³„μ •μ˜ λΉ„λ°€λ²ˆν˜Έλ₯Ό 2번 μž…λ ₯ν•΄μ£Όμ‹œλ©΄ λ©λ‹ˆλ‹€.

New password:
Retype the password:

이제 루트 κ³„μ •μœΌλ‘œ 접속해보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€.
μ•„λž˜ λͺ…λ Ήμ–΄λ₯Ό μž…λ ₯ν•œ λ’€ μ„€μ •ν•œ root κ³„μ •μ˜ λΉ„λ°€λ²ˆν˜Έλ₯Ό μž…λ ₯ν•΄λ³΄μ„Έμš”.

su -

그러면 λ‹€μŒκ³Ό 같이 μ»€λ§¨λ“œ ν™˜κ²½μ΄ $ μ—μ„œ # 으둜 바뀐 것이 λ³΄μž…λ‹ˆλ‹€.

이 μƒνƒœμΌ λ•ŒλŠ” λͺ¨λ“  λͺ…λ Ήμ–΄ μ•žμ— sudo λ₯Ό 뢙일 ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.
ν™ˆμ„œλ²„ 관리λ₯Ό μ’€ 였래 ν•΄μ•Όν•  경우 루트 계정에 μ ‘μ†ν•œ λ’€ sudo λ₯Ό λΉΌκ³  μž‘μ—…ν•˜λŠ” 것이 νŽΈν•˜μ‹€ κ²λ‹ˆλ‹€.

μ•„λž˜ λͺ…λ Ήμ–΄λŠ” λ‘œκ·Έμ•„μ›ƒ λͺ…λ Ήμ–΄μž…λ‹ˆλ‹€.

exit

su - λ₯Ό 톡해 μ ‘μ†ν•œ root κ³„μ •μ—μ„œ μ‚¬μš©ν•  경우 su - λ₯Ό μ‚¬μš©ν•˜κΈ° μ „μ˜ μ‚¬μš©μž κ³„μ •μœΌλ‘œ λŒμ•„κ°ˆ 수 있고 μ‚¬μš©μž κ³„μ •μ—μ„œ μ‚¬μš©ν•  경우 SSH 연결을 μ’…λ£Œν•  수 μžˆμŠ΅λ‹ˆλ‹€.



SSH 계정 μ œν•œ


μ‚¬μš©μž 계정 μ™Έ λ‹€λ₯Έ κ³„μ •μœΌλ‘œ SSH 접속을 ν•˜μ§€ λͺ»ν•˜λ„둝 μ„€μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€.

vim 으둜 SSH μ„€μ • νŒŒμΌμ„ μ—΄κ³  μ•„λž˜ λ‚΄μš©μ„ μΆ”κ°€ν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€.

sudo vim /etc/ssh/sshd_config

λ‹€μŒ λ‚΄μš© 쀑 [계정λͺ…] 뢀뢄을 μžμ‹ μ˜ μ‚¬μš©μž 계정λͺ…μœΌλ‘œ λ°”κΎΈκ³  제일 μ•„λž˜ 쀄에 μž…λ ₯ν•˜μ„Έμš”.

AllowUsers [계정λͺ…]

μ„€μ • λ‚΄μš©μ„ λ°˜μ˜ν•˜κΈ° μœ„ν•΄ SSH μ„œλΉ„μŠ€λ₯Ό μž¬μ‹œμž‘ ν•©μ‹œλ‹€.

sudo service sshd restart




λ°©ν™”λ²½ - iptables


κ°œμš”

iptablesλŠ” λ¦¬λˆ…μŠ€μ—μ„œ 기본으둜 μ œκ³΅ν•˜λŠ” 방화벽을 μ„€μ •ν•΄μ£ΌλŠ” 도ꡬ이고 이것을 μ΄μš©ν•΄ μ„œλ²„μ˜ ν¬νŠΈλ“€μ„ κ΄€λ¦¬ν•΄λ΄…μ‹œλ‹€.

ufwλΌλŠ” νŽΈλ¦¬ν•œ 도ꡬ가 μžˆμ§€λ§Œ μ–΄μ§œν”Ό iptables의 κ·œμΉ™μ„ λŒ€μ‹  μƒμ„±ν•΄μ£ΌλŠ” μ—­ν• μ΄λ―€λ‘œ μ‚¬μš©ν•˜μ§€ μ•Šκ³  직접 해보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€.

쑰금 μ–΄λ €μšΈ 수 μžˆκ² μ§€λ§Œ iptablesλ₯Ό 잘 μ΄ν•΄ν•˜κ³  λ„˜μ–΄κ°„λ‹€λ©΄ ν™ˆμ„œλ²„μ˜ λ³΄μ•ˆμ„ λ”μš± 잘 λ‹€λ£° 수 있게 λ©λ‹ˆλ‹€.


λ‹€μŒ λͺ…λ Ήμ–΄λŠ” λ°©ν™”λ²½μ˜ μƒνƒœλ₯Ό λ³΄μ—¬μ£ΌλŠ” λͺ…λ Ήμ–΄ μž…λ‹ˆλ‹€.

sudo iptables -L


3개의 체인이 보이고 λͺ¨λ“  체인의 정책이 ν—ˆμš©λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

μ •μ±… μ’…λ₯˜

  • INPUT μ„œλ²„λ₯Ό λͺ©μ μ§€λ‘œ ν•˜μ—¬ λ“€μ–΄μ˜€λŠ” λͺ¨λ“  νŒ¨ν‚·μ€ 이 체인을 κ±°μΉ¨
  • OUTPUT μ„œλ²„μ—μ„œ λ§Œλ“€μ–΄μ§„ λͺ¨λ“  νŒ¨ν‚·μ€ 이 체인을 κ±°μ³μ„œ λ‹€λ₯Έ 곳으둜 κ°€κ²Œ 됨
  • FORWARD 이 체인은 INPUT 체인을 톡해 λ“€μ–΄μ˜¨ νŒ¨ν‚· 쀑 λͺ©μ μ§€κ°€ μ„œλ²„κ°€ μ•„λ‹Œ νŒ¨ν‚·μ΄ 거친 ν›„ λ‹€λ₯Έ 곳으둜 κ°€κ²Œ λ˜λŠ” μ²΄μΈμž„



μ΄ˆκΈ°ν™”

μš°λ¦¬κ°€ 닀뀄 λ³Ό 체인은 INPUT ν•˜λ‚˜μž…λ‹ˆλ‹€.
κ±΄λ“œλ¦¬μ§€ μ•Šμ•˜λ”λΌλ©΄ 이미 초기 μƒνƒœμ΄κ² μ§€λ§Œ 잘λͺ» μž…λ ₯ν–ˆμ„ 경우λ₯Ό λŒ€λΉ„ν•΄ 전체 μ΄ˆκΈ°ν™” ν•˜λŠ” 법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

sudo iptables -F
sudo iptables -X 
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT

iptables μ˜΅μ…˜

  • -F μ²΄μΈλ“€μ˜ λͺ¨λ“  κ·œμΉ™μ„ μ‚­μ œ
  • -X κ·œμΉ™μ΄ μ—†λŠ” λͺ¨λ“  체인 μ‚­μ œ
  • -P ν•΄λ‹Ή 체인의 κΈ°λ³Έ 정책을 μ„€μ •



μ„€μ •

  1. λ‘œμ»¬μ—μ„œ 둜컬둜(Loopback)의 λͺ¨λ“  접속은 ν—ˆμš©ν•œλ‹€.
  2. 22번 포트(SSH)둜 λ“€μ–΄μ˜€λŠ” 것을 ν—ˆμš©ν•œλ‹€.
  3. νŒ¨ν‚€μ§€ μ—…λ°μ΄νŠΈμ— κ΄€ν•œ νŒ¨ν‚·λ“€μ„ ν—ˆμš©ν•œλ‹€.
    μƒˆλ‘œμš΄ μ—°κ²° μš”μ²­μ΄μ§€λ§Œ, 기쑴의 μ—°κ²°κ³Ό κ΄€λ ¨λœ νŒ¨ν‚·(RELATED)κ³Ό μƒˆλ‘œμš΄ μ—°κ²° μš”μ²­μ— κ΄€ν•œ κ·Έν›„μ˜ νŒ¨ν‚·(ESTABLISHED)을 ν—ˆμš©ν•˜λŠ” 것인데 κ·Έλƒ₯ νŒ¨ν‚€μ§€ μ—…λ°μ΄νŠΈλ₯Ό ν—ˆμš©ν•˜λŠ” 것이라 μƒκ°ν•˜λ©΄ λœλ‹€.
  4. μœ„μ—μ„œ ν—ˆμš©ν•˜μ§€ μ•ŠλŠ” λͺ¨λ“  νŒ¨ν‚·μ€ DROP(폐기) 처리 ν•œλ‹€.
  5. μ„œλ²„λ₯Ό 거쳐 λ‹€λ₯Έκ³³μœΌλ‘œ κ°€λŠ” λͺ¨λ“  νŒ¨ν‚·λ„ DROP(폐기) 처리 ν•œλ‹€.
sudo iptables -A INPUT -s 127.0.0.1 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT 
sudo iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP

잘 μ„€μ • λ˜μ—ˆλŠ”μ§€ ν™•μΈν•΄λ΄…μ‹œλ‹€.
μ•„λž˜ λͺ…λ Ήμ–΄λ₯Ό μž…λ ₯ ν›„ 좜λ ₯ 화면이 λ‹€μŒ 사진과 κ°™λ‹€λ©΄ μ •μƒμ μœΌλ‘œ 된 κ²ƒμž…λ‹ˆλ‹€.

sudo iptables -L

κ·œμΉ™ 제거

sudo iptables -D INPUT [κ·œμΉ™ μœ„μΉ˜]

INPUT 체인λͺ…인데 λ‹€λ₯Έ 체인듀은 닀루지 μ•Šκ³  항상 INPUT 만 μ„€μ •ν•  κ²ƒμž…λ‹ˆλ‹€.
[κ·œμΉ™ μœ„μΉ˜] μ œκ±°ν•˜κ³ μž ν•˜λŠ” κ·œμΉ™μ΄ λͺ‡ 번째 쀄에 μžˆλŠ”μ§€ μž…λ ₯ν•΄μ£Όμ‹œλ©΄ λ©λ‹ˆλ‹€.

λ§Œμ•½ 잘λͺ»λœ 정보가 μž…λ ₯λ˜μ—ˆμœΌλ©΄ μ΄ˆκΈ°ν™” λͺ…λ Ήμ–΄λ₯Ό μž…λ ₯ν•œ ν›„ λ‹€μ‹œ 섀정해도 λ˜μ§€λ§Œ 잘 μ„€μ •λœ 것듀도 λ‹€μ‹œ μž…λ ₯ν•΄μ•Όν•˜λŠ” λΆˆνŽΈν•¨μ΄ μƒκΈ°λ‹ˆ κ·œμΉ™ 제거 λͺ…령어도 μ•Œμ•„λ‘λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

ν•˜μ§€λ§Œ μ—¬κΈ°μ„œ 끝이 μ•„λ‹™λ‹ˆλ‹€.
μš°λΆ„νˆ¬ μ„œλ²„κ°€ μž¬λΆ€νŒ… 되면 섀정이 λͺ¨λ‘ μ‚¬λΌμ§€κ²Œ λ˜λ―€λ‘œ 섀정을 μ €μž₯을 ν•΄μ•Ό ν•˜κΈ°μ— λ°©ν™”λ²½ 관리 νŒ¨ν‚€μ§€λ₯Ό μ„€μΉ˜ν•˜μ—¬ μ €μž₯ν•˜λ„λ‘ ν•©μ‹œλ‹€.


μ €μž₯

sudo apt install iptables-persistent


μ„€μΉ˜ 도쀑 μœ„μ™€ 같은 그림이 2번 λœ¨λŠ”λ° 각각 ν˜„μž¬ 섀정을 IPv4 와 IPv6에 λŒ€ν•΄ μ €μž₯ν•  것인지 λ¬Όμ–΄λ³΄λŠ” κ²ƒμ΄λ―€λ‘œ Yes λ₯Ό 선택해 μ£Όμ„Έμš”.

μ•„λž˜ λͺ…λ Ήμ–΄λŠ” λ°©ν™”λ²½ 관리 νŒ¨ν‚€μ§€λ₯Ό μ΄μš©ν•΄ 섀정을 μ €μž₯ν•˜κ³  μ μš©ν•˜λŠ” λͺ…λ Ήμ–΄ μž…λ‹ˆλ‹€.
항상 λ°©ν™”λ²½ 섀정을 ν•˜κ³ λ‚œ 뒀에 μ €μž₯ 및 κ°±μ‹ ν•΄μ£ΌλŠ” μŠ΅κ΄€μ„ λ“€μ—¬μ•Ό ν•©λ‹ˆλ‹€.

sudo netfilter-persistent save
sudo netfilter-persistent reload




μΉ¨μž… 차단 - fail2ban


κ°œμš”

fail2ban 은 λΉ„λ°€λ²ˆν˜Έλ₯Ό λ¬΄μž‘μœ„λ‘œ λŒ€μž…ν•΄μ„œ λ‘œκ·ΈμΈμ„ μ‹œλ„ν•˜λŠ” ν•΄μ»€λ“€λ‘œλΆ€ν„° ν™ˆμ„œλ²„λ₯Ό λ³΄ν˜Έν•΄μ€λ‹ˆλ‹€.
λ˜‘κ°™μ€ IP둜 n번 둜그인 μ‹€νŒ¨λ₯Ό ν–ˆμ„ 경우 정해진 μ‹œκ°„ 접속이 λΆˆκ°€λŠ₯ ν•˜κ²Œ μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

보톡 SSH 에 많이 μ μš©ν•˜κ³  λ‚˜μ€‘μ— μ„€μΉ˜ν•΄λ³Ό ν΄λΌμš°λ“œ μŠ€ν† λ¦¬μ§€μ˜ 둜그인 νŽ˜μ΄μ§€ μ—μ„œλ„ fail2ban 을 μ‚¬μš©ν•΄μ„œ 접속을 λΆˆκ°€λŠ₯ ν•˜λ„λ‘ ν•  κ²ƒμž…λ‹ˆλ‹€.


ν•„μš”μ„± νŒŒμ•…

μ•„λž˜ λͺ…λ Ήμ–΄λ₯Ό μž…λ ₯ν•΄λ³΄μ„Έμš”.

journalctl -f


우리의 ν™ˆμ„œλ²„μ— μΉ¨νˆ¬μ€‘μΈ 상황을 μ‹€μ‹œκ°„μœΌλ‘œ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.
μœ„ 사진은 λ‚˜μ€‘μ— 찍은 사진이고 μ œκ°€ fail2ban을 처음 λ„μž…ν•˜λ €κ³  ν–ˆμ„ λ‹Ήμ‹œ 1μ΄ˆμ— λͺ‡λ²ˆμ”© 접속 μ‹œλ„λ₯Ό ν•˜κ³  μžˆλ‹€λŠ”κ²ƒμ„ μ•Œκ²Œ λ˜μ—ˆκ³  κ²‰μœΌλ‘œλŠ” 아무 이상 μ—†μ–΄ λ³΄μ˜€λ˜ ν™ˆμ„œλ²„κ°€ 곡격을 λ°›κ³  μžˆλ‹€λŠ” 사싀에 좩격을 λ¨Ήμ—ˆμŠ΅λ‹ˆλ‹€.

Ctrl + C ν‚€λ₯Ό μž…λ €κ°€λ©΄ λͺ¨λ‹ˆν„°λ§ν•˜λ˜ κ³³μ—μ„œ λΉ μ Έλ‚˜μ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€.


μ„€μΉ˜

μ•„λž˜ λͺ…λ Ήμ–΄λ₯Ό μž…λ ₯ν•˜λ©΄ μ„€μΉ˜κ°€ 되고 μ„€μΉ˜μ™€ λ™μ‹œμ— fail2ban이 λ™μž‘μ„ μ‹œμž‘ν•˜κ²Œ λ˜μ–΄ λ°©μ–΄λ₯Ό ν•΄μ€λ‹ˆλ‹€.

sudo apt install fail2ban

fail2ban 이 λ§Œλ“€μ–΄ λ‚Έ 체인을 ν™•μΈν•΄λ΄…μ‹œλ‹€.

sudo iptables -L


기쑴에 있던 μ„Έ μ’…λ₯˜μ˜ 체인 말고 f2b-sshd λΌλŠ” 체인이 μƒκ²ΌμŠ΅λ‹ˆλ‹€.

λ¬΄ν•œ 좜λ ₯!

이제 이 체인에 λ§Žμ€ κ·œμΉ™λ“€μ΄ 생길 것이며 μ•žμœΌλ‘œ sudo iptables -L λͺ…λ Ήμ–΄λ₯Ό μž…λ ₯ν•˜κ²Œ 되면 λ„ˆλ¬΄ λ§Žμ€ κ·œμΉ™ λ•Œλ¬Έμ— 좜λ ₯이 λλ‚˜μ§ˆ μ•Šμ„ κ²ƒμž…λ‹ˆλ‹€.
좔후에 λ°©ν™”λ²½ κ·œμΉ™μ„ μΆ”κ°€ν•œ λ’€ 확인 ν•˜λ €λ©΄ 체인λͺ…을 뢙인 sudo iptables -L INPUT λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜μ‹œκΈΈ λ°”λžλ‹ˆλ‹€.



μ„€μ •

fail2ban 에 λŒ€ν•œ 감μ˜₯파일 jail.local νŒŒμΌμ„ λ§Œλ“  λ’€ λ‚΄μš©μ„ 상황에 맞게 μˆ˜μ •ν•©μ‹œλ‹€.

sudo vim /etc/fail2ban/jail.local
[DEFAULT]
ignoreip=192.168.0.0/24
bantime=86400
maxretry=5
findtime=86400

[sshd]
enabled = true
port=22
filter=sshd
logpath=/var/log/auth.log

[DEFAULT] fail2ban에 지정할 λͺ¨λ“  μ„œλΉ„μŠ€μ— λŒ€ν•œ μ„€μ • μž…λ‹ˆλ‹€.
[sshd] ssh 접속 μ„œλΉ„μŠ€μ— λŒ€ν•œ μ„€μ • μž…λ‹ˆλ‹€.

  • ignoreip 섀정을 μ μš©ν•˜μ§€ μ•Šμ„ IP 리슀트 μž…λ‹ˆλ‹€.
    보톡 λ‚΄λΆ€μ—μ„œμ˜ 접속듀은 fail2ban을 μ μš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
    μžμ‹ μ˜ ν™ˆμ„œλ²„κ°€ μ™ΈλΆ€λ‘œ λ°”λ‘œ μ—°κ²°λ˜μ–΄ μžˆκ±°λ‚˜ λ‚΄λΆ€μ—μ„œλ„ μ•ˆμ „ν•˜μ§€ μ•ŠμœΌμ‹  뢄듀은 이 μ˜΅μ…˜μ„ μ‚¬μš©ν•˜μ§€ λ§ˆμ„Έμš”.
  • bantime 이상 접속을 κ°μ§€ν–ˆμ„ λ•Œ 접속을 λΆˆκ°€λŠ₯ν•˜κ²Œ ν•  초 λ‹¨μœ„ 의 μ‹œκ°„μž…λ‹ˆλ‹€.
  • maxretry ν—ˆμš©ν•΄ 쀄 횟수 μž…λ‹ˆλ‹€.
    둜그인 κ°€λŠ₯ 횟수라 λ³΄μ‹œλ©΄ λ©λ‹ˆλ‹€.
  • findtime 이상 μ ‘μ†μ˜ 횟수λ₯Ό 총괄 λ‚Ό 초 λ‹¨μœ„ 의 μ‹œκ°„ μž…λ‹ˆλ‹€.
  • enable λ™μž‘ μ—¬λΆ€λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
  • port 감지할 포트 μž…λ‹ˆλ‹€.
  • filter 이상 λ™μž‘μ΄λΌκ³  νŒλ‹¨ν•  λ¬Έμžμ—΄ μž…λ‹ˆλ‹€.
    μ •κ·œμ‹(Regex)λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • logpath 필터링 ν•  전체 λ¬Έμžμ—΄ νŒŒμΌμž…λ‹ˆλ‹€.

μ˜΅μ…˜λ“€μ„ 톡해 ν•œ 쀄 μš”μ•½ν•˜λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

fail2ban μ„œλΉ„μŠ€λŠ” logpath μ—μ„œ filter ν•­λͺ©μ„ μ°Ύμ•„ findtime μ‹œκ°„ λ™μ•ˆ maxretry 횟수 만큼 접속을 μ‹œλ„ν•œ IPλ₯Ό bantime μ‹œκ°„λ™μ•ˆ μ°¨λ‹¨ν•©λ‹ˆλ‹€.



적용

sudo service fail2ban restart



확인

sudo fail2ban-client status sshd

차단 ν’€κΈ°

본인의 ν™ˆμ„œλ²„μΈλ° λΉ„λ°€λ²ˆν˜Έλ₯Ό 잘λͺ» μ³μ„œ fail2ban 이 차단해버린닀면 λ‹Ήν™©ν•  κ²ƒμž…λ‹ˆλ‹€.
μ•„λž˜ λͺ…λ Ήμ–΄λ‘œ 차단을 ν’€ 수 μžˆμŠ΅λ‹ˆλ‹€.

sudo fail2ban-client set sshd unbanip [ip]

[ip] λŠ” 본인이 접속을 μ‹œλ„ν•œ PC의 μ™ΈλΆ€ IP λ₯Ό μž…λ ₯ν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€.




2단계 인증 - OTP


μžμ‹ μ˜ ν™ˆμ„œλ²„μ— μ€‘μš” νŒŒμΌλ“€μ΄ 많고 SSH 접속을 제일 μ•ˆμ „ν•˜κ²Œ μ§€ν‚€λŠ” λ°©λ²•μœΌλ‘œ OTP 인증이 μžˆμŠ΅λ‹ˆλ‹€.

μ„œλΉ„μŠ€ μ„€μΉ˜

Google Authenticator 을 μ„€μΉ˜ν•΄ μ€μ‹œλ‹€.

sudo apt install libpam-google-authenticator



Google OTP μ•± μ„€μΉ˜

μžμ‹ μ˜ μŠ€λ§ˆνŠΈν°μ—μ„œ λ‹€μš΄λ°›μœΌμ‹œλ©΄ λ©λ‹ˆλ‹€.
https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2


μ„€μ •

μ‚¬μš©μž 계정 ν„°λ―Έλ„μ—μ„œ μ•„λž˜ λͺ…λ Ήμ–΄λ₯Ό μž…λ ₯ν•΄μ„œ μ§ˆλ¬Έλ“€μ— 닡을 ν•˜κ³  ꡬ글 Authenticator 섀정을 ν•˜λ©΄ λ©λ‹ˆλ‹€.

google-authenticator
Do you want authentication tokens to be time-based? (y/n)

터미널 화면을 μ΅œλŒ€ν™” ν•΄μ€€ λ’€ y λ₯Ό μž…λ ₯ν•΄μ„œ μ‹œκ°„ 기반으둜 μΈμ¦ν•˜κ² λ‹€κ³  ν•΄μ€λ‹ˆλ‹€.

μž…λ ₯ ν›„ 터미널 화면에 QRμ½”λ“œκ°€ 보이싀 κ²λ‹ˆλ‹€.
μ’€ 전에 λ‹€μš΄ λ°›μ•˜λ˜ 앱을 μ‹€ν–‰ ν•΄μ„œ 우츑 ν•˜λ‹¨μ˜ + λ²„νŠΌμ„ 클릭 ν›„ QR μ½”λ“œ μŠ€μΊ” ν•­λͺ©μ„ λˆŒλŸ¬μ€λ‹ˆλ‹€.
터미널에 좜λ ₯된 QRμ½”λ“œλ₯Ό μ°μ–΄μ£Όμ„Έμš”.

이제 터미널 μ•„λž˜μͺ½μ— emergency scractch codes 라고 8자리의 μˆ«μžκ°€ μ—¬λŸ¬ 쀄 보이싀 텐데 이것듀을 λ³΅μ‚¬ν•΄μ„œ λ”°λ‘œ λ³΄κ΄€ν•΄λ‘μ‹œκΈΈ λ°”λžλ‹ˆλ‹€.

Do you want me to update your "/home/user/.google_authenticator" file? (y/n)

y λ₯Ό μž…λ ₯ν•΄μ„œ μ„€μ • νŒŒμΌμ„ μ—…λ°μ΄νŠΈ ν•΄μ€μ‹œλ‹€.

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)

y λ₯Ό 인증 토큰 μž¬μ‚¬μš©(μ€‘κ°„μž 곡격)을 막아 μ€μ‹œλ‹€.

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)

n 을 μž…λ ₯ν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€.
μ‹œκ°„μ΄ λΆ€μ •ν™• 해도 인증되게 ν•  κ²ƒμ΄λƒλŠ” 것인데 κ΅­λ‚΄μ—μ„œ μ‹œκ°„ μ„€μ • λ¬Έμ œκ°€ μƒκΈ°λŠ” 일이 거의 μ—†μ—ˆμŠ΅λ‹ˆλ‹€.
ν•΄μ™Έμ—μ„œλŠ” 접속을 μ•ˆν•΄λ΄μ„œ λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€.

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)

y λ₯Ό μž…λ ₯ν•΄μ„œ 무차별 λŒ€μž… 곡격을 λ§‰μŠ΅λ‹ˆλ‹€.
fail2ban κ³Ό λΉ„μŠ·ν•˜κ²Œ 30초 λ™μ•ˆ 3번의 μ‹œλ„λ§Œ ν—ˆμš©ν•œλ‹€κ³  λ˜μ–΄μžˆμŠ΅λ‹ˆλ‹€.


SSH μ„€μ •

SSH 접속 μ‹œ μ•„κΉŒ μ„€μΉ˜ν•œ Google Authenticator μ—μ„œ 인증을 ν•˜λ„λ‘ ν•΄μ•Όν•©λ‹ˆλ‹€.

sudo vim /etc/pam.d/sshd

제일 ν•˜λ‹¨μ— λ‹€μŒ λ¬Έμžμ—΄μ„ μΆ”κ°€ ν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€.

auth required pam_google_authenticator.so nullok

nullok λŠ” ν•œ μ‚¬μš©μžλ§Œ Google Authenticator 인증을 μ‚¬μš©ν•˜κ²Œ ν•˜λŠ” κ²ƒμ΄λ―€λ‘œ SSH둜 접속할 수 μžˆλŠ” 계정이 λ‹€μˆ˜μΌ 경우 이 μ˜΅μ…˜μ„ μ§€μš°μ‹œλ©΄ λ©λ‹ˆλ‹€.

sudo vim /etc/ssh/sshd_config

vim μ°ΎκΈ° λͺ…λ Ή

λͺ…λ Ή λͺ¨λ“œ μ—μ„œ /[μ°Ύμ„λ‚΄μš©] 을 μž…λ ₯ν•˜λ©΄ ν•΄λ‹Ή λ¬Έμžμ—΄μ΄ μžˆλŠ” 라인으둜 μ΄λ™ν•˜κ²Œ λ©λ‹ˆλ‹€.

μœ„ 방법을 톡해 μ•„λž˜ λ‚΄μš©μ„ μˆ˜μ •ν•΄μ£Όμ„Έμš”.
λ˜ν•œ 제일 μ•žμ— # 이 μžˆμ„ 경우 주석 μ²˜λ¦¬μ΄λ‹ˆ μ‚­μ œ 해주도둝 ν•˜μ„Έμš”.

ChallengeResponseAuthentication yes
UsePAM yes

이제 SSH μ„œλΉ„μ‹œμ— λ³€κ²½ 사항을 μ μš©ν•©μ‹œλ‹€.

sudo service sshd restart



접속

Putty 접속 μ‹œ μ•„λž˜ λ‚΄μš©μ΄ 좜λ ₯ 될 κ²ƒμž…λ‹ˆλ‹€.

login as:
Keyboard-interactive authentication prompts from server:
| Password:
| Verification code:
End of keyboard-interactive prompts from server
  • login as μ‚¬μš©μž 계정λͺ… μž…λ ₯
  • Password μ‚¬μš©μž λΉ„λ°€λ²ˆν˜Έ μž…λ ₯
  • Verification code 슀마트폰 Google OTP 에 ν‘œμ‹œλ˜λŠ” 숫자 6자리 μž…λ ₯

μœ„ ν•­λͺ©λ“€μ„ λͺ¨λ‘ μž…λ ₯ν•˜λ©΄ 2단계 인증을 ν†΅ν•œ SSH 접속이 μ™„λ£Œλ©λ‹ˆλ‹€.

νŠΈλŸ¬λΈ” μŠˆνŒ…

μˆ˜λ™ IP 섀정을 ν•˜μ…¨λ”λΌλ©΄ 이 문ꡬλ₯Ό 보셨을 κ²λ‹ˆλ‹€.
이번 섀정은 원격 접속에 λŒ€ν•œ μ„€μ •μœΌλ‘œ μ„œλΉ„μŠ€ μž¬μ‹œμž‘μ„ ν•œ ν›„ 접속이 원할 치 μ•ˆν•˜λ©΄ λͺ¨λ‹ˆν„°μ™€ ν‚€λ³΄λ“œλ₯Ό μ—°κ²°ν•΄μ„œ λ‹€μ‹œ μ„€μ • ν•΄μ€˜μ•Ό ν•©λ‹ˆλ‹€.

profile
μ•ˆλ…•, 세상!

0개의 λŒ“κΈ€