sumikko.tokyo

Linux を使う場合のセキュリティの基本

お知らせ: たぶん古い記事です。

🐦「こんにちは。記事メンテナンスサービスです。」

🐦「この記事は大雑把に 830 日以上は経過しているようです。内容の賞味期限にご注意ください。」

Note

対象読者像さんは「GNU/Linux 自力でインストールできる」ものの、 まだ不慣れという状態で「何かをビルドする場合」です。

GNU/Linux を使いだして楽しんでいますか。 どっこい慣れるほど注意が必要になってきます。

Rev 2

手直ししてリンクを調整しました。

Linux におけるセキュリティ意識

Microsoft は Windows Defender という素晴らしい、 超かんたんで効果的なセキュリティシステムを作ってくれました。 怖いインターネットからアヤシイファイルをダウンロードしたら 警告してくれます。 そもそも怪しいサイトへアクセスする段階で警告が出たり、 既知のものは遮断してくれたりします。素敵です。

一時期は邪魔と言われていた UAC も、 不審なファイルが悪さをしないためにすごく役に立ちます。

Linux には強烈な装備はありますが、そういった簡単便利なものは少ないです。

Linux のセキュリティ

まず On-access-scan と言われる、ファイルが書き込まれる時点での ウイルスチェック機能は標準では入っていません。

  1. スキャナー自体は ClamAV や chkrootkit など揃っています。
  2. ファイアーウォール iptables や nftables をきちんと構築すれば硬いです。
  3. システム自体は後述する sudo 等を適切に設定すれば堅牢です。

ただそれらをきちんと設定する責任はユーザーにあります。

サポート

各 Linux ディストリビューションコミュニティの Wiki ページや メーリングリストなどでの質問の場を超えて、 確実なサポートを求める場合や保証が必要な場合は 専門業者に有償で提供してもらうことになります。

その意味では Microsoft Windows や Apple macOS などと大差ありませんが、 GNU/Linux のセキュリティを専門にしている大手は限られますし、 提供者自体の信頼性自体も Microsoft などと比較すれば限られます。

Note

Linux Kernel 自体に結構な対策が盛り込まれているので、 「通常ユーザー権限では」いろいろやっても多少のことでは問題ないでしょう。

問題は通常ユーザーがコマンドで昇格する際や、 ソフトウェア脆弱性でユーザー権限の思わぬ昇格が生じる場合です。

慣れると怖いプログラミング

怖いのは最近流行りのなんちゃら Hub 系で、 他人の作ったオープンソースを自分でビルドしだす頃です。

Note

ビルドとはソースコードから実行ファイルなどを構築する作業です。

全部ソースコードを読んでからビルドしますか? 読むにしても数百 MB のプロジェクトなんて、個人が精査するなんて無理です。

さらに、

  1. ウイルススキャンは未知の脅威には無力です。
    • なんたら Hub 系などで最新版を得る≒未知の脅威の可能性があります。
  2. root 権限で自力ビルドされたらシステム的にはほぼ無防備です。
    • AppArmor などが最近は有効化されている GNU/Linux がありますが、 実際にそれらの LSM で防御されているアプリケーションは少ないです。
    • Secure Boot などで Linux kernel 自体が制約モードになっていれば 被害を緩和できる可能性はありますが、確証は得られません。

自動でダウンロードしてビルドするリスク

そんな状況下で、最近は某ラズパイ関連と合わせて怖いコマンドの 紹介をしている記事を散見したので、この記事を書きました。

IoT 開発関連の他人のプロジェクトのビルドは非常に危険です。

諸悪の根源、自動ビルドスクリプトダウンロードと自動実行

問題はこうです。

  1. 自動ビルドスクリプトになっていて、しかもインターネットから自動で取得する。
    • 本体以外にビルドに必要なソフト(コンパイラなども含む)をダウンロードする。
    • 更に勝手にそれらを使って自動的にいろいろ他のコードをビルドして実行する。
    • かっこいいログが流れたりしても実際に何が起こっているかわからない。
  2. しかもそれを sudo でする仕組みが流行ってきてる。
    • 大抵の場合 sudo はユーザーを全面的に信頼する前提で配布されている。
    • 「通常ユーザーのパスワード」で root 権限を実行できる。
    • sudoers などの設定を自前で整備していないならなんでも実行できる。
  3. sudo は一度パスワードを入力して使ったあとは次からは要求されない。
    • 事実上 root 権限という「なんでもあり」状態に陥りがち。

sudo で 自動ダウンロードしてかつビルド実行してしまう例

さて上記の前提で次のコードを考えてみましょう。

user$ sudo bash -c "$(wget -O - http://dokoka.nantara-hub.com/install_nanika.sh)"

一般ユーザーで動いていると思いがちですが、これではダウンロードを含めて 全部 root 権限で実行されることになります。

sudo + wget/git/.. + シェルスクリプト実行です。順を追うと、

  1. wget 自体は単にダウンロードしている。
    • wget などに脆弱性がある場合はこの時点でアウトになりえます。
  2. 拾ったものがシェルスクリプトである。まあ、そんなときもあります。
    • 一般的 and/or 古典的には、VCS (Git, GNU Bazaar, Mercurial, Subversion など) リポジトリのクローンから始まって、その内容の README を まっしぐらに確認します。
    • ただし VCS ホストされている大手プロジェクトであっても、 開発者への利便性のために上記のような自動スクリプトがあったりします。
  3. シェルスクリプトはなんかのビルドが記載されている。そういうこともある。かな。
    • さてこの場合読む機会はありません。何が書かれているのでしょう。
    • On-access-scan を有効にしている GNU/Linux であっても、 この実行はそもそも root で行われてます。かなり危険です。
  4. 拾って 即実行 。うん?ユーザー権限でなんでもできますよ?
    • 仮に sudo していなくても、そのユーザー権限でなんでもできます。
    • 例えば $HOME を全部消すとか改ざんするとか。
  5. その即実行は sudo で。
    • 通常ユーザー権限ではありません。 sudo してるんで権限昇格してます。
    • 適切な sudo 設定している運用でないなら、 アウトです
    • 初期設定では適切とは言えないものが大半です。 ALL はアウトです。

自宅のドアには施錠、コンピューターには

鍵、かかってないですよね、これだと。

Caution!

sudo + スクリプトダウンロード + その実行 = 「なんでもあり」

上のコードだと、拾ってるスクリプトに対して 「君、我が家でなにをやってもかまわんぞ。好きにくつろぎたまえ。ガハハ」 といって外出していくようなもんです。

特に危険なのは IoT 開発

さて ラズパイとかなら大丈夫だろって思った方、危ないですよ 。 Wi-Fi も有線 LAN も Bluetooth も組み込まれています。 初期設定のセキュリティは開発の便宜上とはいえ、皆無になってます。

上のビルドコード例だと当然インターネットに繋がっているわけです。 隔離もされてないです。

  • 近隣ネットワークへの確固たるアクセス権限の譲渡です。
  • Bluetooth の脆弱性などを組み合わせたら大半の機器を掌握できかねません。
  • Wi-Fi 接続してて PSK だったりすると暗号化鍵も公開するようなものです。
  • そもそもそれらを駆使して IoT 的なことをするためのデバイスです。

そんなものを LAN に組み込んで野良プロジェクトのビルドをやるなんて それだけでも危険です。

カメラやマイクモジュールがある IoT デバイスで root 権限を使った 他人の書いたものの実行は、もはやスパイ道具を自分で自分に使うようなものです。

!DANGER!

sudo は迂闊にやってはなりません。

ビルドにおける最低限のセキュリティ意識

最低限、次のステップを踏むべきです。

  1. VCS などのクローンやソースコード tar ファイルなどのダウンロード
    • 上記例のようなダウンロード+実行ではない。
    • git clonewget URL 単体などでダウンロードのみ。
    • 単一ファイルで提供されるものは理想例では電子署名や SHA ハッシュなどで 検証できるようになってます。
  2. ダウンロードしたものは一度はスキャンする。
    • 一部にはセキュリティテスト用にウイルス陽性となるファイルを混ぜている プロジェクトもあります。
    • そうでなくてもスキャン自体に偽陽性があります (無害であっても間違えてマルウェアと認識される)。
    • 待ってる間にそういう場合などを次の手順で確認してみる。
  3. README や INSTALL などのテキストファイルで手順などを確認する。
    • 大体まっとうなプロジェクトではそういうものがプレーンテキスト、 英語のみで簡明に記載されています。
    • ブラウザなどで閲覧するのではなく、 less などでやったがいいです (悪用例: HTML + JavaScript などで悪意あるコードが含まれているケース)。
    • file でそれらが本当にただのテキストファイルか確認するのもいいでしょう。
  4. パッケージビルドに本当に root 権限が必要か確認する。
    • 試験的にビルドしてテストするだけなら fakeroot などで 実際の root 権限なしでも可能な場合が多いです。
    • インストールまでするにしても、個人の $HOME に置けばいいだけのものも 少なくありません。システム全員に利用できるようにする場合など 限られたケース以外は root 権限なしでインストールできて当然でしょう。
    • ハードウェアを扱うプロジェクトの場合は /dev などへ root 権限でアクセスする必要があることはあります。

Warning

自動スクリプトでやることしか記載していないプロジェクトは要注意です。

その時点でなにかおかしいかも、と疑ってみるべきです。

大手ホストではなく個人サイトにあるような場合はさらにリスキーです。

まとめ

  • Linux では Windows のような簡単便利セキュリティはないと思いましょう。
  • インターネットなど他人のプロジェクトのビルドでは、 まず悪いものが混ざってる可能性を念頭にしましょう。
    • 作者自体がもともと設置していた・配布していたものが、 悪意のある第三者に改ざんされている可能性も考えるべきです。
    • GNU/Linux などの基幹ソースコードにすら、 バックドアなどが発見されることは実際に起こっています。
  • そもそも、その作業に本当に root 権限や sudo が必須なのか、 ちゃんと事前に確認しましょう。

ただこれではやれることはかなり制限されます。 確実な「これやってりゃ OK 」な案は思い浮かびません。

Important

大手の公式ではない他者のコードが絡む開発業務は、それ自体がリスク。

Published: (Modified: )