라즈베리파이를 사용함에 있어 보안은 중요한 요소입니다. 사용자에 따라 필요로 하는 보안의 수준은 달라지게 마련이지만 만약 라즈베리파이에 개인정보를 담아 놓고 충분한 보안조치를 하지 않는다면 여러분의 개인정보가 외부인에게 노출됩니다.
우선 여러분이 라즈베리 파이를 네트워크에 어디에 설치해서 어떻게 사용하느냐에 따라 외부인이 여러분의 개인정보를 얼마나 쉽게 탈취할 수 있는지가 결정됩니다. 예를 들어 여러분이 라즈베리파이를 라우터 및 방화벽 내부에 위치한 홈 네트워크에 놓아두었다면 이것만으로도 강력한 수준의 보안조치가 취해진 것입니다.
하지만 만약 여러분이 어떤 이유에서건 라즈베리파이를 인터넷과 같은 외부 네트워크에 노출시키고자 한다면 (예를들어 SSH 프로토콜을 이용하여 외부에서 라즈베리파이에 접속을 하고자 하는 경우) 이번 포스트에 기술할 보안 강화 조치 내용을 참고하여 기본적인 보안조치를 변경해 주어야 합니다.
본문의 내용은 가장 간단한 보안조치에서 강력한 보안조치 순으로 기술되어 있으므로 전체를 읽어본 후 중복되는 내용은 생략(예를 들어 pi 계정을 비활성화 또는 삭제할 계획이라면 pi 계정의 암호를 변경하는 작업은 불필요합니다.) 하며 자신이 필요로 하는 것을 선택하여 조치하도록 합니다.
물론, 여기에 기술되어 있는 내용만으로 충분하지 않은 경우도 있음을 기억해야 합니다.
기본 암호 변경
라즈베리파이에서 널리 사용되는 운영체제인 라즈비언(Raspbian)을 설치하고 나면, 기본 사용자명과 암호는 pi
와 raspberry
로 설정이 되어 있습니다. 이 계정은 root
(관리자) 권한을 가진 강력한 계정이므로 우선 첫 번째로 이 암호를 변경하도록 합니다.
아래의 명령어를 입력하여 라즈베리파이 설정도구를 실행합니다.
$ sudo raspi-config
두 번째 항목 2 Change User Password
을 선택한 후 안내에 따라 암호를 변경합니다.
raspi-config
를 사용하여 메뉴를 선택하지 않더라도 리눅스의 passwd
명령어를 사용하면 암호를 바로 변경할 수 있습니다.
$ passwd
사용자 이름 변경하기
암호뿐만 아니라 pi라는
사용자 이름을 변경하여 더욱 안전하게 만들 수 있습니다.
윈도우즈와 달리 사용자 이름을 즉시 변경할 수는 없습니다. 다만 새로운 사용자를 만들고, 기존 사용자인 pi를
제거하는 것입니다.
새로운 사용자 추가를 위해서 다음 명령어를 입력합니다. alice
에는 자신이 사용할 사용자 이름을 입력합니다.
$ sudo adduser alice
Adding user `alice' ...
Adding new group `alice' (1002) ...
Adding new user `alice' (1002) with group `alice' ...
Creating home directory `/home/alice' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for alice
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n] Y
안내문구가 화면에 표시되면 새로운 사용자(alice
)를 위한 암호를 입력합니다. 그 외의 사항은 취향에 따라 입력합니다. 마지막으로 입력한 정보를 확정합니다.
새로운 사용자의 홈 폴더는 /home/alice
가 됩니다.
관리자 그룹(sudo)에 새로운 사용자를 추가하기 위해 다음 명령어를 입력합니다.
$ sudo adduser alice sudo
Adding user `alice' to group `sudo' ...
Adding user alice to group sudo
Done.
권한이 올바르게 설정되었는지 확인합니다.
우선 현재 로그인되어 있는 pi
계정을 로그아웃 한 후, 앞서 만든 alice
계정으로 로그인합니다.
sudo su
명령어를 입력합니다. 요구하는 암호를 입력한 후, 프롬프트가 #
으로 변경되는 것을 확인합니다.
alice@raspberrypi:~ $ sudo su
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
[sudo] password for alice:
root@raspberrypi:/home/alice#
특별한 문제없이 잘 실행된다면, 새로 등록한 사용자가 관리자 권한을 갖고 있다는 뜻입니다. 이제 새로운 사용자가 잘 동작하므로 기존의 pi
사용자는 제거하도록 합니다.
※ 단, 현재의 라즈비안 배포판은 pi
사용자가 필요한 경우도 있습니다. 어떤 결과를 초례할 것인지 예상되지 않는다면 pi
사용자를 지우지 마세요. pi
사용자에 대한 의존성을 줄이는 선에서 마무리하는 것이 좋습니다. 하단의 SSH 항목에 대한 보안성 강화 조치를 통해 이를 수행할 수 있습니다.
pi
사용자를 삭제하려면 다음 명령어를 사용합니다. 물론 pi 계정이 아닌 앞서 만든 alice
계정으로 로그인한 후에 수행합니다.
$ sudo deluser pi
Removing user `pi' ...
Warning: group `pi' has no more members.
Done.
해당 명령어를 사용하게 되면 pi
계정은 삭제가 되지만 /home/pi
폴더는 삭제되지 않습니다. 별도로 삭제를 해도 되고, 사용자를 삭제할 때 함께 삭제하고자 한다면 다음과 같이 옵션을 주면 됩니다.
$ sudo deluser -remove-home pi
sudo
사용 시 암호 요구하기
sudo
를 명령어 앞에 넣으면 관리자 권한으로 명령어를 실행하게 되는데, 기본 설정은 이러한 권한을 획득하는데 암호가 필요하지 않습니다. 일반적인 경우에 이는 문제가 되지 않습니다. 하지만 라즈베리파이가 인터넷에 노출되거나 할 경우 이렇게 관리자 권한을 암호 없이 사용하는 것이 보안상 허점이 될 수 있습니다.
강제로 sudo
에 암호를 요구하도록 설정하기 위해 다음을 입력합니다.
$ sudo vi /etc/sudoers.d/010_pi-nopasswd
pi
사용자 항목(삭제하지 않았다면)을 비롯하여 앞서 추가한 관리자 권한을 가지고 있는 모든 사용자들에 대해서 다음과 같이 설정하도록 합니다.
pi ALL=(ALL) PASSWD: ALL
이제 파일을 저장합니다.
최신 보안 패치 적용
라즈비언의 최신판은 항상 최신 보안 패치가 적용되어 배포되기 때문에 이를 유지하도록 합니다. 상세한 라즈비언 업데이트 방법은 다음 포스트의 커널 및 펌웨어 업그레이드 항목을 참고합니다.
만약 여러분이 SSH를 사용하여 라즈베리파이에 접속한다면, 주기적으로 확인하여 자동으로 ssh-server를 업데이트해주도록 설정하도록 합니다.
이 때는 cron_을 사용하는데, _cron 은 Unix 시스템 환경에서 사용되는 작업 관리 도구로 주기적으로 명령 또는 스크립트를 실행하는 데 사용됩니다.
crontab
(cron table) 은 이러한 cron 이 주기적으로 수행할 작업 목록을 편집하기 위해 사용되는 도구입니다. crontab
을 -e
플래그와 함께 실행하여 cron table을 편집합니다.
$ crontab -e
만약 crontab
을 처음 실행하는 것이라면 우선 편집기를 선택하라는 안내가 먼저 나올 것입니다. 저는 평소에 사용 중이던 vi
를 선택하였습니다. 사용하고자 하는 편집기의 번호를 입력 후 Enter
를 눌러 확정합니다.
파일 내의 항목은 아래와 같이 6개의 요소로 구성됩니다. 각 요소는 앞에서부터 분, 시, 일, 월, 년, 요일 그리고 마지막으로 실행할 명령어를 가리킵니다. 앞선 조건이 맞게 되면 해당 명령이 실행되는 구조입니다.
# m h dom mon dow command
# * * * * * command to execute
# ┬ ┬ ┬ ┬ ┬
# │ │ │ │ │
# │ │ │ │ │
# │ │ │ │ └───── day of week (0 - 7) (0 to 6 are Sunday to Saturday, or use names; 7 is Sunday, the same as 0)
# │ │ │ └────────── month (1 - 12)
# │ │ └─────────────── day of month (1 - 31)
# │ └──────────────────── hour (0 - 23)
# └───────────────────────── min (0 - 59)
저는 매일 자정 업데이트를 확인 및 진행하도록 다음과 같이 내용을 편집하였습니다. ( 파일의 가장 하단에 넣습니다.)
0 0 * * * apt install openssh-server
만약 설정한 내용을 확인하고 싶다면 다음의 명령어를 사용할 수 있습니다.
$ crontab -l
SSH 보안 강화
SSH는 라즈베리파이에 원격으로 접근하기 위해 일반적으로 널리 사용되는 방법입니다. 기본적으로 사용자명과 암호만 사용하면 SSH를 통해 라즈베리파이에 접근할 수 있습니다. 이것을 조금 더 안전하게 만들어보도록 하겠습니다. 물론 가장 안전한 보안조치는 키 기반의 인증 기능을 사용하는 것입니다.
사용자명/암호 보안 개선
여러분의 라즈베리파이가 인터넷에 노출이 되어있다면 현재 사용 중인 사용자 암호를 좀 더 견고하게 만들어 주어야 합니다. 1234
와 같은 단순한 암호를 사용하지 않도록 주의하시기 바랍니다.
그리고 sshd
구성을 통하여 SSH를 통한 접근을 허가하거나 차단할 사용자명을 지정하도록 합니다.
$ sudo vi /etc/ssh/sshd_config
아래와 같이 SSH를 통해 접속을 허용할 사용자 이름을 파일의 하단에 추가합니다. 기존 내용이 있는 경우는 사용자 명만 추가하면 됩니다.
AllowUsers edward andrew charles anne
SSH를 통해 접근하지 못하도록 하는 방법도 있습니다. 앞선 과정에서 기본 계정 명인 pi
를 제거하기보다는 여기에 추가하는 것을 추천합니다.
DenyUsers pi harry william
수정이 완료되면 명령어 sudo systemctl restart ssh
를 사용하거나 라즈베리파를 재부팅하여 sshd
서비스를 재시작합니다.
키 기반의 사용자 인증 사용하기
키 쌍이란 두 개의 암호학적인 보안키입니다. 하나는 개인키이고 다른 하나는 공개키입니다. SSH 서버(라즈베리파이)에 접속 시 인증수단으로 사용됩니다.
클라이언트에서 두 개의 암호학적으로 연결된 키를 생성합니다. 두 개의 키는 개인키와 공개키로 구성되어 있습니다. 개인키는 절대 노출되면 안 되고, 공개키는 자유롭게 공유할 수 있습니다. SSH 서버에는 생성한 공개키의 사본을 저장해 놓습니다. 클라이언트에서 개인키를 이용하여 메시지를 암호화하여 서버에 접속을 시도합니다. 이때 서버는 수신한 메시지를 저장해 놓은 공개키를 이용하여 복호화 하고 이 때 사전에 약속되었던 메시지로 복원이 된다면 서버는 해당 클라이언트의 접속을 허용합니다.
리눅스 기반의 클라이언트에서 키 쌍을 생성하는 것은 ssh-keygen
명령어를 사용합니다. 기본적으로 사용자의 홈 디렉터리 아래 .ssh
폴더에 저장됩니다. 개인키는 id_rsa
이며, 관련된 공개키는 id_rsa.pub
입니다. 키는 2048 비트 길이고, 이 키를 무력화 하는데는 굉장히 오랜 기간이 필요하기 때문에 이것이 안전하다고 말할 수 있습니다. 필요에 따라서는 더욱 긴 키도 생성할 수 있습니다. 주의할 점은 키를 반복해서 만들면 앞서 만들었던 키가 덮어씌워진다는 점입니다. 때문에 기존에 해당키를 사용하고 있던 것들도 모두 새로운 키로 갱신해주어야 합니다.
키를 생성하는 동안 패스구문을 입력하라는 안내문이 표시됩니다. 추가적인 보안조치를 위해서 입력할 수도 있지만 저는 그냥 공란으로 놓아 두었습니다.
이제 공개키를 서버(라즈베리파이)로 복사하도록 합니다. 이메일을 이용하던지, 복사&붙여넣기, 파일 복사 등 다양한 방법이 있습니다.
다시한번 강조하면
id_rsa
파일은 클라이언트(PC 등)에 남겨두어야 합니다. 우리가 복사할 파일은 공개키인id_rsa.pub
파일입니다.
서버에 복사한 공개키를 인증된 키 목록(.ssh/authorized_keys
)에 추가하도록 합니다.
※ authorized_keys
파일이 존재하지 않을 수도 있습니다.
$ mkdir -p ~/.ssh && cat id_rsa.pub >> ~/.ssh/authorized_keys
혹은 sudo vi ~/.ssh/authorized_keys
명령을 사용하여 해당파일에 공개키를 복사/붙여넣기 하여 직접 편집해도 됩니다. SSH 가 여러 클라이언트의 접근을 허용할 수 있기 때문에 해당 파일 역시 여러개의 인증키 항목으로 구성되어도 괜찮습니다.
주의할 점은 .ssh
시스템이 authorized_keys
파일을 읽을 수 있는 권한을 갖도록 설정해야 한다는 것입니다.
$ sudo chmod 644 ~/.ssh/authorized_keys
마지막으로 패스워드를 이용한 인증(SSH 접속) 기능을 비활성화 합니다. 이후 모든 인증은 사용자명 및 암호가 아닌 키를 기반으로 진행됩니다.
※ 아래의 내용을 수행하기 전에 충분한 시험을 통해서 기능이 정상동작하는 것을 확인한 후에 해당사용자명 및 암호 인증(로그인) 기능을 비활성화 하기 바랍니다.
$ sudo vi /etc/ssh/sshd_config
아래 3개 항목의 값을 파일에서 찾아서 no
로 변경합니다.
※ 항목이 주석처리 되어 있거나 이미 설정되어 있을 수도 있습니다.
ChallengeResponseAuthentication no
PasswordAuthentication no
UsePAM no
파일을 저장한 후, sudo service ssh reload
를 사용해서 ssh 시스템을 재시작하거나 라즈베리파이를 재부팅 합니다.
참고
'라즈베리파이 > 기초' 카테고리의 다른 글
라즈베리파이 - 인터넷연결확인하기 (0) | 2019.04.18 |
---|---|
라즈베리파이 - IP 확인하기 (0) | 2019.04.16 |
라즈베리파이 - Raspbian 사용하기 (0) | 2019.01.30 |
라즈베리파이 - 운영체제(Raspbian) 설치 (0) | 2018.12.25 |
라즈베리파이 - 삼바서버(공유폴더) 설정하기 (0) | 2018.11.21 |