Electronics

2017.09.15

Raspberry Piを攻撃から守るための手順

Text by Justin Klein Keane and Tom Van de Wiele
Translated by kanai

Key

Raspberry Piは、あらゆるプロジェクトに使える夢のボードだ。安くて、簡単に使えて、さまざまなOSに幅広く対応していて、プログラム可能なGPIOピンやマルチコアのCPUや複数のUSBポートも備えている。

何かを自動化したり情報を集めたりといったプロジェクトに非常に適しているRaspberry Piだが、気をつけていないと、その可愛いボードを使った簡単な趣味のプロジェクトが、ネットワークへの侵入口になるなどのセキュリティホールになってしまう恐れもある。Raspberry Piには、ARM Trustzoneと違ってセキュアブートの機能がない。SDカードやOSは簡単には暗号化できない。そこで、Raspberry Piとみなさんのネットワークに接続された機器を守るためのセキュリティの技を紹介しよう。

Lock3

Raspberry Pi がハックされる理由

・そのコンピューターパワーを悪用して暗号通貨が盗める。
・他のホストを攻撃する際に、攻撃者が特定されないように中継点として使える。
・内部ネットワークの侵入口として使える。攻撃者は簡単にファイルサーバーにアクセスでき、ランサムウエアをインストールできる。脅迫メール用の書類を盗んだり、ファイヤーウォールやルーターの設定を書き換えて、自由に出入りできるようにしてしまう。さらに、ルーターのウェブコンソールを攻撃したりuPNP操作を行って、インターネット上の別のポートを開いて攻撃することもできてしまう。

パスワード

デフォルトのパスワードを変更しよう — 最新バージョンのNOOBSまたはRaspbianをインストールする場合は、piユーザーのパスワードをデフォルトから、もっと長くて推測が難しいものに変更することが大切だ。P@assword1!などというものより、iamasuckerfor5dollarmojitosみたいなパスワードのほうが安全だ。アカウントを無効化する予定でも、このステップは防御の基本であることを覚えておこう。

RaspberryPi

ユーザーアカウント

次のステップは、Raspbianにデフォルトで設定されているPiアカウントを無効化すること。これを行う前に、新しいアカウントを作っておこう。それにはuseraddコマンドを使う。追加フラグを使用すれば、そのユーザーの新しいホームディレクトリーも設定できる。

まずはPiユーザーとしてログインして、以下のコマンドを実行する。

$ sudo /usr/sbin/useradd --groups sudo -m makezine

makezineの部分は自分のユーザー名に書き換えること。これで新しいアカウントと、そのアカウントのためのディレクトリー(/home/makezineといった感じ)が作られる。さらに、ユーザーがsudoコマンドを使えるように、sudoグループのためのアカウントも作っておく。新しいユーザーアカウントができたら、そのアカウントのためのパスワードを、以下のように設定する。

$ sudo passwd makezine

次に、ルートのパスワードをリセットする。長くて推測されにくいパスワードを設定しよう。

$ sudo passwd root

最後に、Piアカウントを無効化する。

$ sudo passwd --lock pi

これで、Piアカウントからログアウトして、新しいアカウントに新しいパスワードを使ってログインできるようになる。

SSHを保護する

デフォルトでは、Raspbianは、どこからでもアクセスできるリモート・アクセス・シェル(SSH)をインストールするようになっている。しかしこれは、認証されたSSHキーを使ってのみ特定のマシンにログインを許可するようにSSHの設定を変更して防ぐことができる。プライベートキーは、少なくとも2つの安全な場所にバックアップを取っておこう。

これを行うには、まずviなどのテキストエディターを使って、以下のコマンドでSSHの設定ファイルを開く。

$ sudo vi /etc/ssh/sshd_config

そして以下の行を設定する。コメント行になっていないことを確認してほしい。コメント行とは、先頭に#マークが付いている説明用の行のことで、この行は設定処理の対象にはならない。

# 認証:
 LoginGraceTime 120
 PermitRootLogin no
 StrictModes yes

RSAAuthentication yes
 PubkeyAuthentication yes
 AuthorizedKeysFile %h/.ssh/authorized_keys

# パスワードを使わない場合はyesに変更する(推奨しません)。
 PermitEmptyPasswords no

# チャレンジレスポンスを有効にする場合はyesに変更する
#(PAM認証とスレッドの問題に注意)
 ChallengeResponseAuthentication no

# 通常のパスワードを禁止する場合はnoに変更する。
 PasswordAuthentication no

UsePAM no

最後の1行は、Pluggable Authentication Modules(PAM)またはLinuxのネイティブな認証を無効化して、キーを使ったログインのみを許可するというもので、とても重要だ。次にSSHキーを生成する。これはWindowsのPuTTYまたはLinuxのssh-keygenコマンドを使って行う。ユーザーのホームディレクトリーに「.ssh」というディレクトリーを作り、以下のコマンドを含むauthorized_keysファイルを作成する。適切に許可が下りるように設定することが大切だ(そうしなければキーを使った認証ができなくなる)。

$ mkdir ~/.ssh
 $ chmod 0700 ~/.ssh
 $ touch ~/.ssh/authorized_keys
 $ chmod 0600 ~/.ssh/authorized_keys

次に、テキストエディターでauthorized_keysファイルを開き、ログインできるように、生成されたパブリックキーを貼り付ける。コマンドの効果が発揮されるように、必ずSSHを再起動すること。

$ sudo systemctl restart ssh

RaspPiZero-7

ファイヤーウォール

SSHの設定が完了したら、Piのiptablesファイヤーウォールが正しく作動しているかどうかを確認しておこう。念のため、ファイヤーウォールのルールが有効になり接続がブロックされたときにメッセージが記録されるよう、ファイヤーウォールを設定しておくとよい。まずは、以下のコマンドを使ってiptablesをインストールする。

$ sudo apt-get install iptables iptables-persistent

iptablesファイヤーウォールを使うためには、新しいカーネルモジュールをロードする必要がある。いちばん簡単な方法は、Piを再起動することだ。iptablesがインストールできたら、以下のコマンドを使ってiptablesの現在のルールを確認する。

$ sudo /sbin/iptables -L

これによってルールのリストが表示される。おそらくまだ何も書かれていないはずだ。ルールは、以下のコマンドでテキストファイルとして保存や編集ができる。

$ sudo /sbin/iptables-save > /etc/iptables/rules.v4

このファイルは、システムが起動または再起動されるときに必ずファイヤーウォールが有効になるように、iptablesを常駐させるものだ。以下のような形にして保存しておこう(必要に応じてルールを編集してほしい)。

$ sudo cat /etc/iptables/rules.v4
 :INPUT ACCEPT [0:0]
 :FORWARD ACCEPT [0:0]
 :OUTPUT ACCEPT [0:0]

# すべてのループバック(lo0)トラフィックを許可し、すべてのトラフィックをloOを使用しない127/8にドロップします。
 -A INPUT -i lo -j ACCEPT
 -A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT

# 確立されたすべての受信接続を許可します。
 -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# すべての送信トラフィックを許可します。
 # 特定のトラフィックのみを許可したいときは、ここを変更してください。
 -A OUTPUT -j ACCEPT

# SSH 接続を許可します。
 # --dport の数値は /etc/ssh/sshd_config のものと同一にしてください。
 -A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT

# iptables によって拒否されたコールを記録します(dmesgコマンドで見られます)。
 -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

# その他のすべての受信を拒否します。明示的にポリシーで許可さない限り、デフォルトで拒否されます。
 -A INPUT -j REJECT
 -A FORWARD -j REJECT

COMMIT

次に、iptablesが正しく機能しているかを確認する。これは、SSHを通してリモートで接続したり、何か問題が発生したが接続を切断したくない場合などは少し複雑になるが、幸いなことに、ルールを適用して接続の確認を助けてくれるコマンドがある。一定時間応答がないときは、プログラムは切断されたものと判断して変更を取り消す。応答があれば、変更を固定する。これは以下のコマンドで行える。

$ sudo /usr/sbin/iptables-apply /etc/iptables/rules.v4

すべてが正常に機能すれば、変更は適用され、その結果を以下のコマンドで確認できるようになる。

$ sudo /sbin/iptables -L

必要のないものは消す。ファイヤーウォールには必要なサービスだけが表示されるようにしよう。できれば、デフォルトではないポートが望ましい。

自前のネットワークに接続する。Piは必ず自前のネットワークにインストールして、通常の使用において、インターネットへの送信のための接続を認識でき、フィルターできるようにしておく。自分のファイルサーバーや他のシステムにPiから接続できないようにしておくことも大切だ。Piからのインターネット接続にも制限を加えるとよい。

RaspPiZero-3

更新とバックアップ

パッケージの更新は定期的に行う。 Raspberry Piのウェブサイトで更新を確認しよう。unattended-upgradesというパッケージをインストールすれば自動更新が可能になる。詳しくはofficial Debian wikiを見てほしい。

設定のバックアップを取る。SDカードは壊れることがある。なので、データまたはSDカードの中身全体を、暗号化したパッケージ、ファイル、またはファイルシステムとしてUSBメモリーにバックアップしておこう。

事前にインストールされているイメージは極力使わない。どこからか手に入れたプレインストールされたイメージを使おうと思ったら、なぜその必要があるのかを考えよう。その作者が信頼できる人物なのか。中身が改造されて怪しいソフトウェアやバックドアが仕込まれていないか。作者の知らないところで組み込まれている可能性もある。それが安全なものかを、よく確かめることだ。不確かなときは、Piが自分だけのネットワーク上にあり、他のシステムやネットワークに接続できない環境にあることを確認してからインストールすること。ルーターにDMZセグメントやゲスト用のWi-Fiネットワークがある場合は、見たいサービスだけがインターネット上で公開できる環境にPiを置くことが望ましい。どうしてもそのイメージをインストールしたいときは、以下のようにするとよい。

・piユーザーとrootユーザーだけでなく、すべてのアカウントのパスワードを変更する。Raspberry Piに付属しているソフトウェアには、いろいろなサービスがある。netstartを使えば、どのサービスが有効かを確認できるので、必要なものだけを公開できるように、ファイヤーウォールとルーターを設定しておく。
・以下の方法でSSHキーを再生成する。

# /bin/rm -v /etc/ssh/ssh_host_*
 # dpkg-reconfigure openssh-server

・有効なサービスが使用するポートを通常使っていないポートに変更し、ソフトウェアの自動インストールやサービスの大量のスキャンを防止する。たいていの攻撃者は、標準のポートを狙ってくるものだ。
・イメージの作者に最新の更新やセキュリティーに関する注意点などを聞く。

持続性を保つ

Hardware Watchdog Timer:旅行で家を離れている間にRaspberry Piがクラッシュすると、自動化されたシステムもダウンしてしまう。だが、Raspberry PiにはBroadcom Hardware Watchdog Timerが付属している。これは、応答がなくなったときにRaspberry Piが自動的に再起動してくれるというものだ。

ヒートシンク:天候やオーバークロックのためにRaspberry Piがオーバーヒートしてしまうのは残念なことだ。そこで、大きな負荷がかかっても熱暴走しないように、CPUにヒートシンクを付けておくとよい。価格も安いし、簡単に取り付けられる。

Logwatch:前日の活動や警告などを夜にメールで送ってくれる。そのためには、Raspberry Piがメールを送信できる状態にしておくことが必要だが、exim4リレー・エージェントが役に立ってくれる。以下のコマンドでLogwatchがインストールできる。

$ sudo apt-get install logwatch

インストールしたら、/usr/share/logwatch/default.conf/logwatch.confファイルを必要に応じて編集する。デフォルトでは、Logwatchはルートアカウントにメールを送るので、なんらかのリレーを使う方がよいかもしれない。詳しくは、私の電子メールリレーに関する記事を見てほしい。

原文