라즈베리 파이 보안 설정
USERADD 를 통해 등록된 계정만 보기
grep /bin/bash /etc/passwd
grep /bin/bash /etc/passwd | cut -f1 -d:
이거 역시 아이디만 짤라서 보여줌USERADD 를 통해 등록된 계정만 보기grep /bin/bash /etc/passwd
grep /bin/bash /etc/passwd | cut -f1 -d:
이거 역시 아이디만 짤라서 보여줌
기본 패스워드 변경하기
passwd
사용자명 변경하기
sudo adduser alice
새로운 사용자의 패스워드를 생성하라는 메시지가 나타날 것입니다.
새로운 사용자의 홈 디렉터리는 /home/alice
가 됩니다.
sudo
퍼미션을 갖도록 하기 위해, 다음과 같이 sudo
그룹에 추가합니다.
sudo adduser alice sudo
퍼미션이 올바로 설정되었는지(즉, sudo
를 사용할 수 있는지) 확인합니다.
sudo su
이것이 잘 실행된다면 해당 사용자가 sudo
그룹에 있다는 것을 확신할 수 있습니다.
pi
사용자를 삭제하려면 다음과 같이 타이핑합니다.
sudo deluser pi
위의 명령은 pi
사용자를 삭제하되, /home/pi
폴더를 남겨둡니다. pi
사용자의 홈 폴더까지 삭제해야 한다면, 다음의 명령을 사용할 수 있습니다. 이 폴더에 속한 데이터는 영구적으로 삭제되므로, 필요한 데이터가 저장되어 있지 않은지 반드시 확인하세요.
sudo deluser -remove-home pi
sudo에 패스워드 걸기
명령의 앞에 sudo
를 두면 수퍼유저로서 실행되는 것이 기본값이며, 패스워드가 필요하지 않습니다. 일반적으로는 이것이 문제가 되지 않습니다. 하지만, 당신의 파이가 인터넷에 노출되며 어떤 이유로 exploit된다면(웹페이지 exploit을 예로 들 수 있습니다), sudo
가 패스워드를 요구하도록 설정해두지 않았다면 공격자는 수퍼유저 자격을 필요로하는 것들을 변경할 수 있습니다.
sudo
가 패스워드를 필요로 하게 만들려면, 다음과 같이 입력합니다.
sudo nano /etc/sudoers.d/010_pi-nopasswd
그런 다음, pi
항목(혹은 수퍼유저 권한을 갖는 사용자명)을 다음과 같이 변경합니다.
pi ALL=(ALL) PASSWD: ALL
이제 파일을 저장합니다.
최신 보안 픽스 적용하기
최신 배포판은 모든 최신 보안 픽스를 포함하므로, 라즈비안의 버전을 최신으로 유지하기만 하면 됩니다. 모든 지침이 여기에 있습니다.
라즈베리 파이에 연결하기 위해 SSH를 사용한다면, ssh-server를 업데이트하는 cron 작업을 추가하는 것도 좋습니다. 다음의 명령을 일간 cron 작업으로 실행하여, 일상적인 업데이트 프로세스와 관계 없이 최신 SSH 보안 픽스를 즉시 적용할 수 있습니다. cron을 설정하는 자세한 방법은 여기를 참조하세요.
apt install openssh-server
SSH 보안 향상
SSH는 라즈베리 파이에 원격으로 접속하는 데에 일반적으로 사용하는 방법입니다. SSH 로그인에 사용자명과 패스워드를 요구하는 것이 기본값인데, 그보다 더 안전한 방법도 있습니다. 키 기반 인증을 사용하는 것이 더욱 안전한 방법입니다.
사용자명/패스워드 보안 강화
무엇보다도 중요한 것은, 매우 견고한 패스워드를 갖추는 것입니다. 만약 라즈베리 파이가 인터넷에 노출될 경우, 패스워드는 매우 안전해야 합니다. 그것이 사전(dictionary) 공격 등을 막는 데에 도움이 됩니다.
또한, sshd
구성을 변경함으로써 특정 사용자를 허용 또는 차단할 수 있습니다.
sudo nano /etc/ssh/sshd_config
다음과 같이, 로그인을 허용하고자 하는 사용자명을 담고 있는 행을 파일의 끝에 추가합니다.
AllowUsers edward andrew charles anne
DenyUsers
를 사용하여, 특정 사용자가 로그인하지 못하도록 할 수 있습니다.
DenyUsers harry william
변경 후에는 sudo systemctl restart ssh
를 사용하여 sshd
서비스를 재시작하거나, 리부트하여 변경이 적용되도록 해야 합니다.
키 기반 인증 사용하기
키 쌍은 암호학적으로 안전한 두 개의 키이며, 개인 키와 공개 키로 이루어집니다. 그것을 사용하여 SSH 클라이언트를 서버(여기서는 라즈베리 파이)에 인증할 수 있습니다.
클라이언트는 암호학적으로 서로 연결된 두 개의 키를 생성합니다. 개인 키는 절대 노출되어서는 안 되지만, 공개 키는 자유롭게 공유할 수 있습니다. SSH 서버는 공개 키의 사본을 취하여, 연결이 요청될 때 이 키를 사용하여 클라이언트에 challenge 메시지를 보냅니다. 해당 클라이언트는 개인 키를 사용하여 암호화합니다. 만약 서버가 공개 키를 사용하여 이 메시지를 원래의 challenge 메시지로 해독할 수 있다면, 클라이언트의 신원을 확인할 수 있습니다.
리눅스에서 키 쌍을 생성할 때는 클라이언트 측에서 ssh-keygen
명령을 사용합니다. 키는 사용자의 홈 디렉터리에 있는 .ssh
폴더에 저장되는 것이 기본값입니다. 개인 키는 id_rsa
로 불리며 연관된 공개 키는 id_rsa.pub
라고 불립니다. 키의 길이는 2048 비트입니다. 이 길이의 키에서 암호를 깨뜨리는 것은 극도로 긴 시간이 걸리므로, 매우 안전하다고 할 수 있습니다. 원한다면 더 긴 키를 만들 수도 있습니다. 생성 과정을 한 번만 수행해야 함에 유의하세요. 만약 반복하게 되면, 생성된 키를 덮어써버립니다. 오래된 키에 의존하는 것은 모조리 새 키로 갱신해야 합니다.
키를 생성할 때 암호구(passphrase)를 물어볼 것입니다. 이것은 보안의 추가 수준입니다. 일단은 이것을 비워둡니다.
이제 공개 키를 서버에 옮겨야 합니다. 이메일을 이용하거나, 잘라서 붙이거나, 파일을 복사하는 방법이 있습니다. 서버로 옮겼으면 SSH 시스템 인증 키에 추가해야 합니다. id_rsa
파일은 개인 키이며 클라이언트 밖으로 유출되어서는 안됩니다. id_rsa.pub
는 공개 키입니다.
다음과 같이, 새 공개 키를 인증 파일에 추가합니다.
cat id_rsa.pub >> ~/.ssh/authorized_keys
다른 방법으로, sudo nano ~/.ssh/authorized_keys
로 파일을 편집하여 키를 복사/붙여넣기할 수 있습니다. authorized_keys 파일에 여러 개의 항목이 있어도 됩니다. SSH는 다중 클라이언트를 지원할 수 있습니다.
ssh
시스템이 authorized_keys 파일을 읽을 수 있도록 퍼미션을 올바로 지정해야 합니다.
sudo chmod 644 ~/.ssh/authorized_keys
끝으로, 패스워드 로그인을 비활성화하여, 모든 인증이 키 쌍을 통해서만 이루어지도록 합니다.
sudo nano /etc/ssh/sshd_config
no
로 변경할 항목이 세 개 있습니다.
ChallengeResponseAuthentication no
PasswordAuthentication no
UsePAM no
파일을 저장하고, sudo service ssh reload
로 ssh 시스템을 재시작하거나 리부트합니다.
방화벽 설치하기
리눅스에는 방화벽 솔루션이 많이 있습니다. 패킷 필터링을 제공하는 iptables 프로젝트를 많이 사용합니다. 이 프로젝트는 리눅스 netfiltering 시스템에 기반합니다. 라즈비안에는 iptables
가 기본으로 설치되나 설정이 되지 않은 상태입니다. iptables
를 구성하기가 번거롭기 때문에, 간단한 ufw 인터페이스도 제공합니다. 'Uncomplicated Fire Wall'의 약자이며, 우분투(Ubuntu)의 기본 방화벽 도구이기도 합니다. 이것을 라즈베리 파이에 쉽게 설치할 수 있습니다.
sudo apt install ufw
ufw
는 GUI도 제공하지만, 상당히 직관적인 명령행 도구입니다. 문서에는 몇 가지 명령행 선택 사항이 잘 설명되어 있습니다. ufw
는 수퍼유저 권한으로 실행해야 하므로, 모든 명령 앞에 sudo
를 붙여야 합니다. 또한, ufw
명령을 --dry-run
옵션을 붙여서 사용할 수 있는데, 그렇게 하면 실제로는 변경이 이루어지지 않고 결과를 미리 확인해볼 수 있습니다.
방화벽을 활성화하고, 부트 시에 시작하도록 하려면 다음의 명령을 실행합니다.
sudo ufw enable
방화벽을 비활성화하고, 부트 시에 시작하지 않게 하려면 다음의 명령을 실행합니다.
sudo ufw disable
특정 포트에 접근을 허용합니다(예에서는 22번 포트를 사용합니다).
sudo ufw allow 22
포트에 대한 접근을 차단하는 것도 아주 쉽습니다(여기서도 22번 포트를 예로 듭니다).
sudo ufw deny 22
특정 포트에 대하여 어느 서비스를 허용하거나 차단할지도 정할 수 있습니다. 아래의 예는 22번 포트에 대하여 tcp를 차단합니다.
sudo ufw deny 22/tcp
어느 포트를 사용하는지 알지 못하더라도 서비스를 지정할 수 있습니다. 이 예는 방화벽을 통한 ssh 서비스 접근을 허가합니다.
sudo ufw allow ssh
status 명령으로 방화벽의 모든 설정을 볼 수 있습니다.
sudo ufw status
특정 IP 주소를 차단하거나, 어느 방향의 트래픽을 허용할 것인지 정의하고, 연결 시도 횟수에 제한을 두는 것과 같은 복잡한 규칙을 만들 수 있습니다. 이는 서비스 부인(Dos) 공격을 물리치는 데 도움이 됩니다. 특정 장치(eth0, wlan0 등)에 적용할 규칙을 정할 수도 있습니다. 자세한 사항은 ufw
맨 페이지(man ufw
)를 참조하되, 여기에 몇 가지 복잡한 명령에 대한 예를 들었으니 참고하세요.
tcp를 사용하여 ssh 포트에 로그인을 시도하는 것을 제한합니다. 특정 IP 주소에서 30초 내에 여섯 번 이상 시도하면 연결을 차단합니다.
sudo ufw limit ssh/tcp
IP 주소 192.168.2.1로부터 30번 포트에 접근하는 것을 차단합니다.
sudo ufw deny from 192.168.2.1 port 30
fail2ban 설치하기
라즈베리 파이를 ssh
혹은 웹서버와 같은 서버로 사용한다면, 방화벽에는 서버 트래픽이 흐르도록 하는 '통로'가 있을 것입니다. 그런 경우에 Fail2ban이 유용합니다. Fail2ban은 파이썬으로 작성되었으며, 라즈베리 파이에서 생성되는 로그 파일을 검사하여 의심스러운 행동을 찾습니다. 또한, 로그인에 대한 다중 brute-force 시도 등을 잡아내며, 의심스러운 IP 주소로부터의 로그인을 차단하도록 방화벽에 통지할 수 있습니다. 침입 시도를 로그 파일에서 수작업으로 찾는 수고를 덜어주며, 방화벽 설정을 자동으로 갱신합니다(iptables
를 이용합니다).
다음의 명령으로 fail2ban을 설치합니다.
sudo apt install fail2ban
저장소의 Fail2ban 버전(v0.8.13)은 IPv6 네트워크를 지원하지 않음에 유의하세요. IPv6를 사용한다면, v0.10 이상을 소스로부터 설치해야 합니다. 이에 대한 자세한 정보는 Fail2ban 웹사이트를 참조하세요.
Fail2ban 설치 시 /etc/fail2ban
폴더가 생성되며, 그곳에는 jail.conf
라는 구성 파일이 있습니다. 이것을 jail.local
에 복사하고 활성화해야 합니다. 이 구성 파일에는 기본값 옵션들과 함께, 특정 서비스가 비정상인지 검사하는 옵션이 있습니다. ssh
에 대하여 사용되는 규칙을 검사ᐧ변경하는 방법을 알아봅시다.
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
[ssh]
섹션을 보세요. 다음과 비슷할 것입니다.
[ssh]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 6
위의 예에서 섹션의 이름은 ssh이며, 활성화(enable)되어 있고, ssh 포트를 검사하며, /etc/fail2ban/filters.d/sshd.conf
파라미터를 사용하여 필터링하고, 해로운 활동을 감시하기 위해 /var/log/auth.log를 분석하며, 여섯 번까지 재시도를 허용합니다. 다음과 같은 default 섹션에서 기본 차단(ban) 설정을 볼 수 있습니다.
# Default banning action (e.g. iptables, iptables-new,
# iptables-multiport, shorewall, etc) It is used to define
# action_* variables. Can be overridden globally or per
# section within jail.local file
banaction = iptables-multiport
iptables-multiport
는 Fail2ban 시스템이 탐지 임계치에 도달했을 때 /etc/fail2ban/action.d/iptables-multiport.conf
파일을 실행함을 의미합니다. 사용할 수 있는 액션 구성 파일에는 여러 가지가 있습니다. Multiport는 모든 포트에 대한 모든 접근을 차단합니다.
특정 IP에서 세 번 실패하는 경우 영구적으로 차단하고 싶다면, [ssh]
섹션에서 maxretry 값을 변경하고 bantime에 음수를 지정합니다.
[ssh]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = -1
Fail2ban의 내부를 설명하는 좋은 튜터리얼이 여기 있습니다.