보안?
라즈베리 파이가 보안 취약점이 될 수 있으므로 몇 가지 보안 조치를 해보려고 합니다.
사용자 명, 기본 패스워드 변경하기
최신 imager는 사용자 명과 기본 패스워드는 이미지를 굽거나 OS 설치 시 변경했으므로 별도의 변경이 필요 없습니다.
변경하고 싶다면 config로 변경할 수 있습니다.
1. 기본 패스워드
sudo raspi-config
설정에 들어가셔서
System Options -> S3 Password 엔터
터미널에서 새 비밀번호를 입력하시면 됩니다.
2. 유저명 변경
절차는 다음과 같습니다.
- 새 사용자 추가 및 패스워드 추가
- sudo 퍼미션 추가
- 기존 유저 삭제
다음과 같이 새 사용자를 추가 후 비밀번호를 생성해줍니다.
sudo adduser alice
이제 새로운 사용자의 홈 디렉터리는 home/alice가 됩니다.
sudo 퍼미션을 할당해줍니다.
sudo adduser alice sudo
su alice
su명령어를 통해 유저를 변경할 수 있습니다.
이제 새로운 유저를 등록했으니 기존 유저는 삭제해도 됩니다.
sudo deluser <기존 유저명> sudo //sudo 퍼미션 삭제
sudo deluser <기존 유저명> // <기존 유저명> 삭제
sudo deluser -remove-home <기존 유저명> // 파일까지 삭제
sudo에 비밀번호 걸기
sudo vim /etc/sudoers.d/010_pi-nopasswd
저는 vim에디터가 좋으므로 vim으로 수정했습니다.
NOPASSWD의 NO를 지워서 패스워드 검사를 활성화해줍니다.
앞으로 sudo 명령어를 사용할 때마다 "우리는 널 믿지만 패스워드 입력해" 메시지를 보게 될 것입니다.
최신 보안 픽스 적용
최신 배포판은 이미 최신 보안 픽스이므로, 라즈 비안의 버전을 최신으로 유지하면 됩니다.
만약 라즈베리파이를 연결하기 위해 SSH를 사용한다면, ssh-server를 업데이트하는 cron 작업을 추가하는 것도 좋습니다.
apt install openssh-server
cron은 유닉스 계열 컴퓨터 운영체제의 시간 기반 잡 스케줄러입니다. 자동화라고 볼 수 있네요.
cron명령어는 위 블로그에서 상세하게 설명하고 있으니 간단히 설정만 하겠습니다.
crontab -e
우선 작업을 하나 생성합니다. 처음 생성하게 되면 에디터를 설정해야 하는데 편한 거 선택하면 됩니다.
문법은 다음과 같습니다.
# ┌───────────── min (0 - 59)
# │ ┌────────────── hour (0 - 23)
# │ │ ┌─────────────── day of month (1 - 31)
# │ │ │ ┌──────────────── month (1 - 12)
# │ │ │ │ ┌───────────────── day of week (0 - 6) (0 to 6 are Sunday to Saturday, or use names; 7 is Sunday, the same as 0)
# │ │ │ │ │
# │ │ │ │ │
# * * * * * command to execute
자정에 실행하길 원하므로 0 0 * * * 로 넣어줍니다.
만약 권한이 없어서 안된다면 sudo를 추가하는 것도 하나의 방법입니다.
작성된 cron을 확인하고 싶다면 crontab -l
으로 확인할 수 있습니다.
방화벽 설치하기
리눅스에는 방화벽 솔루션이 많은데 그중 원문에 소개된 ufw인터페이스를 사용하려고 합니다. ufw는 "Uncomplicated Fire Wall"의 약자이며 우분투의 기본 방화벽 도구입니다.
sudo apt install ufw
간단하게 설치할 수 있습니다.
방화벽을 활성화하고, 부트 시에 시작하도록 하려면 다음의 명령을 실행합니다.
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
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
IP 주소 192.168.2.1을 허가합니다.
sudo ufw allow from 192.168.2.1
등록한 룰을 잘못 입력했다면 삭제합니다.
sudo ufw delete allow 21/tcp
이 외에도 다양한 ufw룰이 있습니다. 원하는 룰을 하나씩 추가해주면 됩니다.
반드시 SSH 포트는 허용해주셔야 Putty나 MobaXterm으로 접속할 수 있습니다.
fail2ban 설치하기
파이를 포트 포워딩해서 외부로 노출된다면, 무수한 악수요청이 있는걸 로그로 볼 수 있습니다. 이럴 경우 fail2ban을 통해 접근 시도를 막을 수 있습니다.
Fail2ban은 침입차단 소프트웨어 프레임워크로서 컴퓨터 서버를 무차별 대입 공격 으로부터 보호합니다.
다음 명령으로 fail2ban을 설치합니다.
sudo apt install fail2ban
Fail2ban 설치 시 /etc/fail2ban 폴더가 생성되며, jail.conf 구성 파일을 볼 수 있습니다. jail.local에 복사해줘야 활성화됩니다.
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo vim /etc/fail2ban/jail.local
파일에 들어가게 되면 설명이 되게 많은데 간단 요약하면
- bantime = 사용자가 밴되는 시간입니다.
- findtime = maxretry(최대 재시도 횟수)를 시도하는 총시간입니다.
- maxretry = 최대 재시도 횟수입니다.
따라서 bantime=10m, finetime=10m, maxretry=5 이면 10분 내로 5번 초과로 틀릴 경우 10분간 block 합니다.
이제 1시간 내로 5번 초과해서 틀린다면 7일간 밴됩니다.
systemctl restart fail2ban
서비스를 재시작해줍니다.
이제 우리가 설정한 config가 반영됐습니다.
현재 block상태를 알고 싶다면
sudo fail2ban-client status sshd
sshd에 대한 정보를 볼 수 있습니다.
차단된 IP 풀어주기 (2022-09-12 추가)
추석 보내고 나니 서버 비밀번호를 까먹어서 밴 됐습니다.
sudo fail2ban-client set sshd unbanip <IP 주소>
만약 실수로 밴 됐다면 unbanip 명령어로 풀어주면 됩니다.
끝
라즈베리 파이에 대해 보안설정을 마쳤습니다. 나중에 서버나 포트 포워딩 같이 공개된 환경에서 사용할 일이 많다면 보안설정은 필수라고 생각합니다. 작업하는 게 귀찮긴 하지만 해킹되는 것보다 나으니까요..
참고
'라즈베리파이' 카테고리의 다른 글
파이 한글 깨짐 해결 및 입력기 설치 (0) | 2022.11.18 |
---|---|
[docker] 포트 포워딩 설정하기 (1) | 2022.10.26 |
[docker]라즈베리 파이에 도커 설치하기 (1) | 2022.10.25 |
[docker]kotlin + SpringBoot를 Docker Hub에 올리기(feat.FCM) (0) | 2022.10.20 |
라즈베리 파이4 설치 및 초기설정 (0) | 2022.09.01 |