Help us understand the problem. What is going on with this article?

[wip] Raspberry Piのセキュリティを高めてみた

More than 1 year has passed since last update.

はじめに

Raspberry Piをレンタル機材として貸し出すとき、いたずらされても影響が出ないようにしつつも、メンテナンスするときには調整できるようにするにはどうすればいいか考えてみた。

Linux側 設定 - SSH編

前提事項

 セットアップ時、多くはLAN+NAT環境内でセットアップしていると思います。そのため直接Raspberry Piにグローバルアドレスが割り当てられることは無いとはずです。いきなりDMZエリア内に設置とかしてしまうと、何があるかわからないので辞めましょう。

まずは、閉じたネットワークかUSBでデータをコピーする方法などで、データが漏洩しないように気をつけます。

デフォルトユーザー:piのパスワードを変更する

$ passwd
Changing password for pi.
(current) UNIX password:        ← 今まで使用していたパスワード
Enter new UNIX password:        ← 新しく設定するパスワード
Retype new UNIX password:       ← もう1回、入力
passwd: password updated successfully

SSHにてログイン時のパスワードを使わず鍵認証方式に変更する

鍵認証用の鍵ファイルを作る

秘密鍵と公開鍵を作ります。

$ cd ~/.ssh
$ ssh-keygen -t rsa -C pi@hostname
Generating public/private rsa key pair.
Enter file in which to save the key (/home/pi/.ssh/id_rsa):     ← キーファイルを保存する場所。
Enter passphrase (empty for no passphrase):                     ← 鍵認証用のパスワード
Enter same passphrase again:                                    ← 鍵認証用をもう1回。
Your identification has been saved in /home/pi/.ssh/id_rsa.
Your public key has been saved in /home/pi/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:ZIsDa1VaRefXXXXXXXXU2HS7w4II2Ulh0AkSDlN6bcc pi@hostname
The key's randomart image is:
+---[RSA 2048]----+
|   ..oo=oE  + =.+|
|    .+.+o.... .+.|
|    o o S. ....+ |
|   .   .     ....|
|    = o+*o.o B o.|
|              o .|
|             . + |
|              . .|
|   o.+.o**= . . .|
+----[SHA256]-----+
$ cat id_rsa.pub >> authorized_keys

秘密鍵ファイルをログイン元の環境へ送る

生成された~/.ssh/id_rsaを安全にローカルPCへファイル転送する

sshdの設定を書き換える

/etc/ssh/sshd.config
- #PasswordAuthentication yes
+ PasswordAuthentication no

参考:Passwordless SSH access - Raspberry Pi Documentation

SSHを有効にするけど、ポート番号は変更する

/etc/ssh/sshd.config
- Port 22
+ Port 10022

SSHの22番、あたりまえなので狙われます。パスワード認証を受け入れなくても、無駄に接続してくることが多いので、SSHの受け待ちポート番号を変更します。10022とか20022とかも、変更後の定番どころかと思います。10000~64000の間の適当な数をポートに割り当てたほうが良いかもしれません。

rootの直接ログインを禁止する

/etc/ssh/sshd.config
- #PermitRootLogin prohibit-password
+ PermitRootLogin no

sshdを再起動する

  • 何かあってもいいようにログインできているセッションはそのまま切断せずに保持しておく
  • sudo /etc/init.d/sshd restart
  • 下記のログインパターンを試してみる
    1. root
    2. pi & パスワードチャレンジ(秘密鍵なし)
    3. pi & 秘密鍵あり

3のパターンのみログインできればOK。

ここまで設定したpi、sshの秘密鍵ファイルを捨てて、新しいssh接続用ユーザーを作る。

ユーザーの作成。

adduserとuseraddを間違えると設定がする量が変わるので、注意が必要

  • adduser : ユーザー作成ウィーザードが表示されるので、質問に答えていけばOK
  • useradd : ユーザーを追加する。いろいろとオプションを指定して実行する必要あり。
$ sudo adduser yyano
Adding user `user9999' ...
Adding new group `user9999' (1001) ...
Adding new user `user9999' (1001) with group `user9999' ...
Creating home directory `/home/user9999' ...
Copying files from `/etc/skel' ...
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully
Changing the user information for user9999
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

追加したユーザーがsudoが使えるようにグループに追加する

$ sudo gpasswd -a user9999sudo

新しく作成したユーザー用の鍵認証用の鍵ファイルを作る

$ sudo su user9999
$ mkdir ~/.ssh
$ ssh-keygen -t rsa -C user9999@hostname
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user9999/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/user9999/.ssh/id_rsa.
Your public key has been saved in /home/user9999/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:vPY0xZ08cNSWyXXXXiy2+BqoTWIpW4fhdlcoqQDFnl0 user9999@hostname
The key's randomart image is:
+---[RSA 2048]----+
|     ..       ...|
|     ..   E  . .*|
|      . S o +oBo |
|       o * +.... |
|      . % B o.   |
|       B X o ..  |
|    .. o .  . o==|
|     .o..  o *o*o|
|      . . o ..   |
+----[SHA256]-----+
$ cat id_rsa.pub >> authorized_keys

ログインできることを確認。

Linux側 設定 - iptables編

ディストリによってはiptablesだったりfirewalldだったり。ここではiptablesを設定するパターンで進めていきます。

iptables関連パッケージを追加する。

$ sudo apt update
$ sudo apt upgrade
$ sudo apt install iptables-persistent

iptables-persistent、ipv4版とipv6版を両方とも作りましょう。

/etc/iptables/rules.v4
# Generated by iptables-save v1.6.0 on Fri Sep 15 22:00:00 2017
*filter
:INPUT ACCEPT [64879:93089593]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [33379:1852635]

-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp --tcp-flags ALL NONE -j DROP
-A INPUT -p tcp ! --syn -m state --state NEW -j DROP
-A INPUT -p tcp --tcp-flags ALL ALL -j DROP

-A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p udp --sport 53 -j ACCEPT

-A INPUT -p tcp --dport 10022 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT

COMMIT
# Completed on Fri Sep 15 22:00:00 2017

省略しますが、rules.v6も同じように作ります。
設定ファイルに記述が終わったらiptablesを適用していきます。

$ sudo /etc/init.d/netfilter-persistent restart

iptables-persistentではなく、netfilter-persistentになってました。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした