インターネットは危険に満ちている。不正アクセスやウィルス被害も、「ハッカーのいたずら」程度であった牧歌的な時代は終わり、犯罪組織が金銭を目的に、明確な悪意を持った攻撃を行なうようになってきている。企業がサイバーテロによって業務を妨害されたり、ランサムウェアによってデータを人質に取られたり、といった事件が報道されるのを目にしたことがある方も多いのではないだろうか。
こうした被害に合うのは、なにも大企業に限った話ではない。ホビーユースの個人PCであっても、セキュリティ対策は欠かすことのできない大切な要素だ。そこで今回は、日常的にUbuntuを使うにあたって必要な、セキュリティ対策について紹介しよう。
パッケージを最新にしよう
残念ながら、どのようなソフトウェアも多かれ少なかれバグを抱えている。もちろんバグはリリース前に修正できるのが理想ではあるのだが、通常はリリース後に新たな問題が発覚し、その都度修正を行なう、いわば対処療法的なアプローチで脆弱性や不具合に対応しているのが現実だ。そのため新しいアップデートがリリースされたら、可及的速やかに適用するのが望ましい。これはUbuntuに限らず、WindowsやMacを使っていても同じなので、PC Watchの読者であれば今さら言うまでもないだろう。
Ubuntuではソフトウェアを「パッケージ」として管理しているため、アップデートもパッケージ単位で配布される。基本的にはパッケージの新しいバージョンがリリースされると、デスクトップ上に通知が表示されるので、指示に従ってアップデートしてくれればよい。
コマンドから行なう場合は、aptコマンドを使って以下のように実行するとよいだろう。
$ sudo apt update && sudo apt upgrade -y
とはいえ実際のところ、面倒くさがってアップデートの通知を延々と無視し続けている人もいるのではないだろうか。実は筆者も「まあ後でいいか……」と、通知をスルーする(そしてそのまま忘れてPCの電源を切る)ことがよくある(真似しないでください)。このような状態が長く続くと、Ubuntuは危険に晒された状態のままになってしまうのだろうか?
だが安心してほしい。実はUbuntuでは、セキュリティに関するアップデートに限り、ユーザーが何も操作をしなくとも、自動的に適用するようになっている。本連載の第4回でパッケージとリポジトリについて解説したが、Ubuntuでは「通常のアップデート」と「セキュリティアップデート」を異なるリポジトリで提供している。そしてセキュリティアップデート用のリポジトリから提供されるパッケージだけは、定期的にアップデートを適用するように設定されているのだ。
これは「unattended-upgrade」という仕組みで実現されている。パッケージを自動的にアップデートするということは、予想外の問題を引き起こす可能性も否定できない。だがセキュリティアップデートに限って言えば、アップデートを保留してセキュリティリスクを放置するよりも、自動的に最新の状態を保つ方がメリットが大きいため、このような設定になっている。
このように、Ubuntuではユーザーが特に意識しなくとも、最低限のアップデートはきちんと行われるようになっている。だがパッケージのアップデートはサボらず、こまめに行なうように心がけて欲しい(自戒を込めて)。
ファイアウォールやウィルス対策ソフトは必要?
OSを守るセキュリティ対策と言って思い浮かぶものは、なんと言ってもファイアウォールとウィルス対策ソフトだろう。
意外に思われるかもしれないが、デフォルト状態のUbuntuにおいて、ファイアウォールは有効化されていない。これはデスクトップ版だけでなく、サーバー版でも同様だ。なぜかと言えば、Ubuntuはデフォルトでは、外部からの接続を受け付けるタイプのサービスを一切起動しないためだ。Ubuntuはサーバー版であっても、明示的に指定しない限り、SSHサーバーすらインストールされない。そもそも外部から接続することができないため、ファイアウォールも不要という理屈だ。
だがこれは、あくまでデフォルト状態での話に限る。もしも自分でサーバーアプリをインストールし、インターネットに対して公開するような場合は、手動でファイアウォールを設定することを強く推奨する。
Linuxカーネルには、パケットフィルタリング機能が実装されている。これはパケットの送信元アドレスや宛先ポート、各種フラグなどを条件に、パケットを受け入れたり、逆に破棄したり、別の宛先へルーティングしたりといったことを可能にする機能だ。そしてそのフィルタリングルールを管理するため、長らく「iptables」というツールが広く使われてきた。また最近では、iptalbesの後継として「nftables」と呼ばれるツールが採用されるケースも増えてきている。
だがこれらのツールは非常に多機能である反面扱いが難しく、お世辞にも初心者が直感的に使えるツールとは言えない。そこでUbuntuでは、より抽象的にルールを管理できるファイアウォール構成ツールとして、UFWが用意されている。本記事ではUFWの具体的な使い方までは紹介しないが、サーバーを構築する際はリンク先のドキュメントを参考にして、ファイアウォールを構成するとよいだろう。
なおUFWの設定を簡単に行なえるGUIとして、「Gufw」がある。ルールを簡単に管理できるだけでなく、プロファイルを切り替えることで「自宅内ではファイアウォールを無効にし、会社のネットワークではHTTPだけを通す」といった運用も行なえる。デスクトップ環境がインストールされたノートPCを持ち歩くような場合に便利だ。
ウィルス対策ソフトについては、原則として不要だと言っていいだろう。理由としてはいくつか挙げられるが、なんといってもLinux向けのマルウェアは、常に監視しなければならないほど蔓延しているわけではない点が大きい。また通常の利用をしている限り、一般ユーザーの権限で/usrや/etcといったシステム関連のディレクトリを書き換えることはできないため、「知らないうちにシステムにマルウェアがインストールされていた」ということに対しても、そこまで神経質になる必要はない。
もちろんroot権限を奪取するような脆弱性を攻撃されたり、ユーザーのホームディレクトリにマルウェアをインストールされる可能性は存在する。だがこうした被害を防ぐには、常時ウィルスを監視するよりも、「怪しいサイトにアクセスしない」、「パッケージを常に最新に保つ」、「パスワードは強固なものを使う」、「怪しいスクリプトやバイナリは実行しない」、「よく分からないのにroot権限を使わない」といった、ユーザーの振舞いの方が重要になってくる。言い換えると、こうした部分を疎かにしている限りは、ウィルス対策ソフトを入れていても、あまり意味はないだろう。
ただしファイルサーバーなどのように、WindowsやMacと共有するデータを扱っている場合は、定期的にウィルススキャンをする意味はあるかもしれない。Linuxで動くウィルス対策ソフトとしてはClamAVなどが有名だ。UbuntuではAPTからインストールできるので、興味があったら試してみてもいいだろう。
sudoでroot権限を適切に扱う
そもそもユーザーとは、OSにおいてファイルを所有したり、プロセスを実行する実体のことだ。LinuxはマルチユーザーのOSのため、OSの利用者や動かす機能ごとに、複数のユーザーを作成して使い分けるのが一般的だ。
ユーザーは大きく2つに分けられる。システムに関する完全な権限を持つ「root(ルート)」ユーザーと、それ以外の「一般ユーザー」だ。そして一般ユーザーには、そのユーザーにとって必要とされる権限のみが与えられている。
例えば、普段ログインに利用しているユーザーが自由に読み書きできるのは、自分のホームディレクトリだけに限定されている。システムワイドなコマンドがインストールされた/usr/binディレクトリや、設定が保存された/etcディレクトリは、読み込みや実行こそ可能なものの、書き込みはできない。またほかのユーザーのホームディレクトリに至っては、読むことすらできない。
ユーザーごとに権限が制限されているというのは、不便で煩わしいと感じるかもしれない。だがこれはセキュリティを高めるための工夫なのだ。例えば、root権限で動作しているWebサーバーがあるとする。そしてWebアプリの脆弱性を攻撃され、Webサーバー上で任意のコマンドを実行されるような事態が起きたことを考えてみよう。この場合、root権限でコマンドを実行されてしまうため、即サーバーの陥落に繋がる。だがWebサーバーの権限を必要最小限に絞っておけば、攻撃者は権限の及ばない部分に対しての攻撃は行なえない。セキュリティの世界では、これを「最小権限の原則」と呼んでいる。
これはセキュリティ面では有利であるものの、一般ユーザーではパッケージのインストールや設定の変更といった作業も行なえない。そのため、通常は一般ユーザーで作業し、必要な時だけrootに「昇格」して作業するのがLinuxのお作法とされている。
少し古いLinuxディストリビューションを触ったことがある人の中には、「su」コマンドでrootユーザーにスイッチしたり、ログインプロンプトから直接rootユーザーとしてログインした経験があるかもしれない。
だがUbuntuでは、セキュリティ上の理由からrootユーザーはロックされており、使用できなくなっている。そのため直接のログインはもちろん、「su」コマンドによるスイッチもできない。その代わり、Ubuntuではroot権限を得るのに「sudo」コマンドを使う。
「sudo」とは、指定したコマンドを、任意のユーザーの権限で実行するためのコマンドだ。任意のユーザーと言ったが、一般的にはroot権限で実行するために使われる。使い方は簡単で、実行したいコマンドの前にsudoを付加するだけだ。
sudoをつけてコマンドを実行すると、パスワードを要求される。ここに自分のパスワードを入力しよう。なお入力したパスワードのエコーバック(***などが表示されること)が行なわれないため、正しく入力ができていないと勘違いする人も多いが、これは「そういうもの」なので、気にせず入力して構わない。パスワードが正しければ、root権限で指定したコマンドが実行される。
下は、自分の名前を表示する「whoami」コマンドをroot権限(sudoつき)で実行した例。sudoをつけるとrootとしてコマンドが実行されていることがよく分かる
$ whoami
mizuno$ sudo whoami
[sudo] mizuno のパスワード: ← 自分のパスワードを入力する
root
コマンドごとに都度sudoをつけたり、パスワードを入力するのは面倒だと思うかもしれない。だがこれは、敢えて面倒にしているという面もある。root権限で実行するコマンドというのは、システムに対して何らかの影響を与えるコマンドだ。使い方を1つ間違えると、システムを破壊するようなコマンドも珍しくない。そのためsudoの付与とパスワード入力というワンクッションを挟むことで、「自分が今何をしているのか」、「本当にこのコマンドを実行してよいのか」を考える時間ができるというわけだ。
ただしsudoは、一度パスワードを入力すると、以後15分の間はパスワードの再入力が不要になる。この時に、手クセで間違ったコマンドをうっかり実行してしまった、といったことがないよう注意してほしい。
またsudoを経由して実行したコマンドは、システムにログが残る。そのため何をやったか(あるいはやらかしたか)を、後から追跡しやすいという別のメリットもある。
当然だが、誰でも自由にsudoを使用できては本末転倒だ。そこでUbuntuでは、管理者として認められたユーザーにのみ、sudoの使用が許されている。これは具体的には「sudo」グループに所属するユーザーのことで、インストール時に作成したユーザーは、自動的にこのグループに所属している。
余談になるが、Ubuntuでもrootユーザーをアンロックして、従来のように直接ログインすることもできる(ここでは具体的な方法は紹介しない)。だがUbuntuは、「rootユーザーでの直接ログインはできない」ことを前提に設計されているOSだ。そのため不用意にrootユーザーを使用可能にすると、思わぬセキュリティリスクを生んでしまう可能性がある。OSのデフォルト設定にはそれなりの意味があるため、なるべくUbuntuの流儀に倣った利用を心がけよう。
今回はUbuntuにおけるセキュリティの基本的な考え方について解説してきたが、適切に運用してさえいれば、気をつけることはそれほど多くないことが理解できたのではないだろうか。
だがUbuntuへのログインやroot権限への昇格といったセキュリティは、パスワードによってのみ保護されている。そのため言うまでもないが、パスワードは強固なものを、安全に管理しなければならない。そこで次回は、セキュアなパスワードとはなにか、加えてパスワード以外によってUbuntuを保護する方法について紹介しようと思う。
コメント