Ubuntu日和
【第22回】強固なパスワードと二要素認証でUbuntuのセキュリティをさらに高めよう
2023年3月4日 06:27
セキュアなパスワードを使おう
Ubuntuにログインする際や、前述のsudoを実行する際には、パスワードを入力する必要がある。コンピュータを誰もが自由に使えてしまったり、root権限を行使できてしまっては問題があるため、パスワードを入力して正当な利用者であることを証明しているわけだ。この本人確認のことを「認証」と呼ぶ。
当然だが、パスワードはなんでもいいというわけではない。他人にコンピュータを勝手に使われないように守るためのものなので、第三者に簡単に推測されてしまったり、当てずっぽうで突破されてしまうようなパスワードは使ってはいけない。世間でもよく言われていることだが、パスワードは辞書に載っているような単語は避け、数字や記号などを含みつつ、十分な長さを持つものが望ましい。
Ubuntuをインストールした時に、初期ユーザーを作成したことを覚えているだろうか。ユーザーのパスワードを決定する際、パスワード入力欄の横に、パスワードの強度が表示される。不正ログインを防ぐためにも、十分に強度のあるパスワードを設定するよう心がけて欲しい。sudoが可能なユーザーのパスワードが破られてしまうと、Ubuntuを完全に乗っ取られてしまう危険性もあるため、特に注意が必要だ。
Ubuntuには、パスワードの強度をチェックするツールも用意されている。それが「cracklib-check」だ。デスクトップ版のUbuntuであればデフォルトでインストール済みのはずだが、もしもインストールされていない場合は、端末から以下のコマンドを実行して「crackib-runtime」パッケージをインストールしよう。
$ sudo apt install -y cracklib-runtime
チェック用のコマンドは「cracklib-check」だ。実行すると、対話的に文字列を入力できるようになるので、パスワードを入力してEnterを押そう。そのパスワードが妥当か、そうでないなら何が問題かを教えてくれる。普段使っているパスワードをチェックしてみるとよいかもしれない。
強いパスワードを作るには
弱いパスワードを使ってはいけないことは理解できたと思うが、では具体的に、強いパスワードはどのように作ったらよいのだろうか。お勧めは、パスワード生成用のツールを利用することだ。
筆者は普段「apg」というツールを利用している。Ubuntuでは同名の「apg」パッケージをインストールすることで利用できる。
$ sudo apt install -y apg
apgコマンドを実行すると、ランダムな英数字と記号で構成されたパスワードの候補がいくつか表示される。
apgのユニークな所は、デフォルトで「発音可能な」パスワードを生成する点だ。完全にランダムなパスワードというのは、人間にとっては覚えにくいものだ。もちろん、パスワード管理ソフトを使えば、パスワードの複雑さ自体は、それほど問題にはならないだろう。だがOSのログインパスワードや、パスワード管理ソフトのマスターパスワードのように、どうしても暗記を強いられるパスワードも存在する。
そこでapgでは、複雑なパスワードでも覚えやすいよう、声に出せるパスワードを作成し、その読み方も表示してくれる。……まあ実際のところ、筆者はこれで、覚えやすいパスワードだと思ったことはないのだが。
$ apg
Mad#tweulj4 (Mad-CROSSHATCH-tweulj-FOUR)
0opOryoll` (ZERO-op-Or-yoll-GRAVE)
yidNeuryem*od7 (yid-Neur-yem-ASTERISK-od-SEVEN)
Dawdum0Blupoc# (Dawd-um-ZERO-Blu-poc-CROSSHATCH)
7drykEvebtelb} (SEVEN-dryk-Ev-eb-telb-RIGHT_BRACE)
Ark0Slylk" (Ark-ZERO-Slylk-QUOTATION_MARK)
apgでは、単純にランダムなパスワードを生成することもできる。パスワード生成アルゴリズムを指定する「-a」オプションを用いて、以下のように実行してみよう。
$ apg -a 1
[W!J2yIhLf
3'CQ[v1T{K
czz{pH`x^
lAG$28k91o
=F_U+K<?
Yh%$j=}N[3
世の中には、「パスワードに記号が使えない」、「パスワードは8文字までしか指定できない」といった、(残念な)Webサービスも存在する。apgではパスワードに使用する文字セット(大文字、小文字、数字、特殊記号)と、パスワードの長さを指定することもできるため、(不本意ながら)こうしたWebサービスの仕様にも対応可能だ。パスワードの長さは、「-m」オプションで最小文字数を、「-x」オプションで最大文字数を指定できる。
例えば8文字のパスワードを生成したい場合は、双方のオプションに引数として「8」を指定するといいだろう。パスワードに使用する文字種は、「-M」オプションに続いてシンボルを指定する。シンボルの意味は以下の表の通りだ。
また「-E」オプションを使うと、引数に指定した文字だけを使わないこともできる。特定の記号のみが使えないような場合は、「-M S」で記号を含めるよう指定した上で、「-E」を使って特定の記号のみを除外するのがいいだろう。例えば「-M S -E '#'」とすると、記号は含むが「#」は使わなくなる。
シンボル | 意味 |
---|---|
S | 記号を必ず含める |
s | 記号を含む |
N | 数字を必ず含める |
n | 数字を含む |
C | 大文字を必ず含める |
c | 大文字を含む |
L | 小文字を必ず含める |
l | 小文字を含む |
$ apg -M NCL -m 8 -x 8
8Oteadva
idack4Ol
Daytfav9
FoampEn2
OcNihed1
uphBelf9
なお生成したパスワードを前述のcracklib-checkにパイプすることで、生成と同時に強度をチェックしてみるのもお勧めだ。
$ apg -a 1 -M ncl -m 4 -x 8 | cracklib-check
mewUf7: 辞書の単語に基づいています
CGX8q0Qt: OK
7uCYl: 短かすぎます
wpLYb: 短かすぎます
qXDyx: 短かすぎます
3B0PxVvD: OK
ハードウェアキーでUbuntuを守る
Ubuntuへのログインやsudoの行使には、パスワードによる認証が必要となるのは既に述べた通りだ。ここで改めて、認証について少し深掘りしてみよう。
認証の方式は大きく、「知識認証(Something you know)」、「所有認証(Something you have)」「生体認証(Something you are)」の3つに分類される。そしてパスワードは、このうち知識認証に属している。パスワードは手軽に使える反面、盗み見るだけでも簡単にコピーが可能であり、一度盗まれてしまえば、その意味を成さなくなってしまう。また辞書攻撃や総当たり攻撃によって突破される可能性もあり、セキュリティの強度としてはそれほど高くない。
そこで最近では、複数の認証方式を組み合わせてセキュリティを高める「二要素(あるいは多要素)認証」の利用が広く推奨されている。Webサービスでも、スマホアプリや専用のトークンを利用して、ワンタイムパスワード(使い捨ての一時的なパスワード)を入力したことのある人も多いだろう。
なおここで大切なのは「多要素」、つまり複数の認証方式を組み合わせるという点だ。例えばログインに際して「秘密の質問」を要求するWebサービスがあるが、秘密の質問はパスワードと同じく知識認証だ。これは「二段階の認証」を行なってはいるものの、認証要素としては「単要素」に留まるため、セキュリティの強度はそれほど上がらない。だが異なる要素を組み合わせれば、セキュリティの強度は格段に上がる。某天空の城は、自壊用コマンドをたった3文字のパスワード(知識認証)で起動することができるが、コマンドの起動には王家に伝わる石(所有認証)を、石の継承者(生体認証)が身につける必要があるため、セキュリティは十分に担保されているのだ。たぶん。
Ubuntuへのログインも、二要素認証を使ってセキュリティを高めることができる。本記事ではFIDO/U2Fに対応したセキュリティキーである「YubiKey」を利用した方法を解説しよう。なおYubiKeyはGoogleなどをはじめ、さまざまなWebサービスへのログインにも利用できるため、1つ持っておくと便利かもしれない。
Universal 2nd Factor、略してU2Fを簡単に説明すると、専用のハードウェアを用いて二要素認証を簡素化するための標準規格だ。前述の通り、Webサービス等の二要素認証においては、スマホアプリやハードウェアトークンなどで生成したTOTP(主に6桁の数字)を利用するのが一般的だ。だがこれは、ログインの度にスマホやトークンを用意し、手で数字を入力しなければならず、非常に面倒くさい。
そこでU2Fでは物理的なキー使って認証を行なう。USBやNFCで端末に接続したキーを、タッチするだけで認証が行なえるため、非常に手軽なのだ。そのうえ物理的にキーを所持していないと認証ができないため(所有認証)、セキュリティの強度を大きく高めることができる。なおU2Fが内部でどのような処理を行なっているかは、こちらが参考になるので、興味があったら見てみよう。
UbuntuではPAMと呼ばれる仕組みを用いてユーザー認証を行なっている。まずU2Fを利用可能にするため、以下のコマンドでPAMモジュールをインストールしよう。
$ sudo apt install -y libpam-u2f
続いて、使用するYubiKeyを登録する。YubiKeyをUSBポートに挿入したら、以下のコマンドを実行しよう。2行目のpamu2fcfgコマンドを実行すると、YubiKeyの端子部分のLEDが点滅するので、指でタッチする。これで登録は完了だ。
$ mkdir -p ~/.config/Yubico
$ pamu2fcfg > ~/.config/Yubico/u2f_keys
PAMに関する設定は、/etc/pam.d以下にある。インストールしたU2FのPAMモジュールを使用するよう、各設定ファイルを書き換えよう。UbuntuへのGUIログインを管理しているのが「/etc/pam.d/gdm-password」だ。このファイルをテキストエディタで開き、以下の変更を加えよう。
$ sudo nano /etc/pam.d/gdm-password
auth required pam_succeed_if.so user != root quiet_success
@include common-auth
auth optional pam_gnome_keyring.so
↓
auth required pam_succeed_if.so user != root quiet_success
@include common-auth
auth required pam_u2f.so nouserok ← 「@include common-auth」の後にこの行を追加
auth optional pam_gnome_keyring.so
本連載19回でも紹介したが、Ctrl+Alt+F3キーを押すと、GUIではなく「黒い画面」からログインすることができる。この方法でログインする場合は、認証の経路が異なるため、「/etc/pam.d/login」というファイルも同様に書き換える必要がある。書き換える内容は同一で、「@include common-auth」という行の後に、「auth required pam_u2f.so ~」という行を追加すればいい。以後はログイン画面でパスワードを入力してEnterを押してから、点滅したYubiKeyをタッチして、はじめてUbuntuへログインできるようになる。
sudoの認証にYubiKeyを使うこともできる。「/etc/pam.d/sudo」と「/etc/pam.d/sudo-i」という2つのファイルを、同様に書き換えよう。ただし書き換える内容は微妙に異なり、ここでは「nouserok」オプションは不要だ。
@include common-auth
@include common-account
↓
@include common-auth
auth required pam_u2f.so ← 「@include common-auth」の後にこの行を追加
@include common-account
以後はsudoの実行時にも、パスワード入力の後にYubiKeyへのタッチを求められるようになる。
さて、2回に渡ってさまざまなトピックを紹介してきたが、日常的なPCの利用においては、パッケージのアップデートやパスワードの適切な運用、二要素認証の導入など、基本的なことを心がけていれば十分だと言えるだろう。それよりも繰り返しになるが、信頼できないサイトにアクセスしない、不用意にファイルをダウンロードしないといった、ユーザー自身の対策が大切であることを忘れないでほしい。