お知らせ: たぶん古い記事です。
🐦「こんにちは。記事メンテナンスサービスです。」
🐦「この記事は大雑把に 1090 日以上は経過しているようです。内容の賞味期限にご注意ください。」
以前のオープソースのビルド記事でラズパイ関係のコマンドの 注意点、特に sudo 使う場合のことを書きました。
オチとして、やはり万能な対策は思いつきません。
そこでsumikko.tokyo的なラズパイ、というかLinux硬化作戦を書きます。
要点は「悪意のある遠隔操作リスクをいかに減らすか」です。
sudo を窓から投げ捨てる
Raspberry Piに限らず最近のLinuxでは sudo 大はやりです。
ただあれはまともな設定を行って、 「一部のユーザー」に「一部の権限」を移譲してシステム管理を楽にするものです。
sudo は、システム管理者が制限された root 権限をユーザに与え、 root としての 活動を記録するために設計されたプログラムです。 基本的な哲学としては、 できるだけ少ない権限を与えつつも、 ユーザが作業を実行できるようにすることです。
—Debianのsudoパッケージの表記より抜粋
その点で言うと、作成し配布する側にはクレーム対策としての意味とか いろいろな大人の事情があるのでしょうが、 sudoグループのユーザーにすべてのコマンドを許可している標準設定は酷いです。
Note
反論としては「ドキュメントを読んで各々でsudo設定をせよ」でしょう。 それなら初期設定では「何もできない」が適切じゃなかろーかと思います。
そこで簡単な第一段階対策は、もちのロンで、ポイです。
root# apt purge sudo
これでユーザーパスワードでの任意の root 権限行使は防げます。 要するに root ログインしないとシステム管理はできません。
不便と思うならまず注意です。もともとシステム管理コマンドなんて、 サーバー屋さんが日常的に多数のサーバー管理しないとそんな頻繁にやることないです。
- rootコンソールを扱うときの誤操作の被害を減じることができる、 というメリットというか副効果はあるかも知れません。
- ただsumikko.tokyo的にはむしろ 「細心の注意を払ってシステム管理コマンドを打つべし」 という観点で最低限のコマンドをrootコンソールでパチパチ打ち込みます。
事前に必要なファイルとかコマンド手順 (例えばiptablesの設定スクリプトとか)は通常ユーザーで準備しておきます。
Note
仮に sudo を使う場合は必ず絶対 sudoers を設定しましょう。
sudo 最大の問題は「通常ユーザーパスワード」でやれてしまうことです。
それを踏まえても信用できる人間が使うユーザーだけが使うべきものです。
Hint
パッケージビルド関係で一時的な root 権限が必要なら、 fakeroot 使えばいいだけの話です。
ユーザーの root 化を許さない
次にRaspberry PiのようなIoT機器では、 業務上必要な場合もあるかもですが、 ユーザーシェルからの root 化を許さない手があります。
これはラズパイに限った手法でもなく、 大抵のLinuxで同様に可能な方法です。
su での root 権限を無くす
PAMのsu関係の設定で、root パスワードを知っていても、 su で root になれなくしてしまいます。
root# nano /etc/pam.d/su # Debian (Raspbian)の場合
auth required pam_wheel.so # コメントアウトされてるので外して有効にします。
これで例えばユーザーが su - して root パスワードを打ち込んでも、 root シェルは開かなくなります。
user$ su -
Password: (rootパスワードを打ち込む)
su: Permission denied
これで root として 直接 ログインするしか root 権限を手に入れることは できなくなりました。
Note
ただしこれもいわゆる「wheelシステムグループ」を設定すると要注意です。
遠隔からの root ログインを防ぐ
これもIoT的には必要かもしれませんが、 手元にある機材なら遠隔からの悪用を塞ぐのに便利な設定です。
上述のPAMのsu制限と組み合わせて、 物理的なターミナルからしか root ログインができなくします。
Caution!
遠隔操作システムでこれをやると二度とrootログインできなくなります。 手元の物理的にアクセスできる機器にしか設定してはなりません。 その場合でもまず w コマンドで自分のアクセスコンソールを確認しましょう。
必要なことは簡単です。securettyを最小限の物理コンソールだけにします。
root# cp /etc/securetty /etc/securetty.orig # バックアップ
root# nano /etc/securetty
tty1 # 普通にCtrl-Alt-F1とかで切り替える物理ターミナルたち
tty2
(中略)
(ptsとかは入れない)
ttyS0 # シリアルケーブルでつなぐ場合
この状態でリブートすれば、 次からは /etc/securetty で定義されたターミナルから 直接 root ログインするしか システム権限を行使することは不可能になります。
Warning
ただし万能ではなく、セキュリティホールで 権限の昇格があった場合は任意のユーザーがゾンビ root となってシステムに(禁則事項)をしてしまいます。
また sudo や wheel システムグループを設定すると、貫通しかねません。
まとめ
- sudo を捨てる。少なくとも適切に制限した設定にする。わからないなら使わない。
- PAMで su を制限することを検討する。
- 物理コンソールでしかrootログインできなくすることを検討する。
この3点セットで、大概の遠隔攻撃からは防御できるはずです。
ただし所有者・管理者も、 物理的なターミナルから直接 root ログインしないと システム管理はできなくなります。 そこらへんのさじ加減はシステム管理者の都合次第でしょう。
本場の大規模システム管理業務やってる方々はむしろシリアルケーブル1本挿して クールにやってるんじゃないかなーとか想像してます。 最近だとIPMIとかなのかな。使ったこともないし知らないですけど。
ご一読ありがとうございました。