Ubuntu日和

【第22回】強固なパスワードと二要素認証でUbuntuのセキュリティをさらに高めよう

Ubuntuのインストーラのユーザー作成画面。ここではパスワードとして「password」と入力してみたが、ご覧の通り「弱いパスワード」と警告された。このようなパスワードの使用は絶対に避けよう

 この連載の第21回では、Ubuntuにおけるセキュリティの基本的な考え方について解説した。今回はより強固なセキュリティを実現するための工夫と、便利な機能を紹介しよう。

セキュアなパスワードを使おう

 Ubuntuにログインする際や、前述のsudoを実行する際には、パスワードを入力する必要がある。コンピュータを誰もが自由に使えてしまったり、root権限を行使できてしまっては問題があるため、パスワードを入力して正当な利用者であることを証明しているわけだ。この本人確認のことを「認証」と呼ぶ。

 当然だが、パスワードはなんでもいいというわけではない。他人にコンピュータを勝手に使われないように守るためのものなので、第三者に簡単に推測されてしまったり、当てずっぽうで突破されてしまうようなパスワードは使ってはいけない。世間でもよく言われていることだが、パスワードは辞書に載っているような単語は避け、数字や記号などを含みつつ、十分な長さを持つものが望ましい。

 Ubuntuをインストールした時に、初期ユーザーを作成したことを覚えているだろうか。ユーザーのパスワードを決定する際、パスワード入力欄の横に、パスワードの強度が表示される。不正ログインを防ぐためにも、十分に強度のあるパスワードを設定するよう心がけて欲しい。sudoが可能なユーザーのパスワードが破られてしまうと、Ubuntuを完全に乗っ取られてしまう危険性もあるため、特に注意が必要だ。

現在のパスワードは、「設定」→「ユーザー」の「パスワード」の部分をクリックして変更もできる

 Ubuntuには、パスワードの強度をチェックするツールも用意されている。それが「cracklib-check」だ。デスクトップ版のUbuntuであればデフォルトでインストール済みのはずだが、もしもインストールされていない場合は、端末から以下のコマンドを実行して「crackib-runtime」パッケージをインストールしよう。

cracklib-runtimeパッケージのインストール
$ sudo apt install -y cracklib-runtime

 チェック用のコマンドは「cracklib-check」だ。実行すると、対話的に文字列を入力できるようになるので、パスワードを入力してEnterを押そう。そのパスワードが妥当か、そうでないなら何が問題かを教えてくれる。普段使っているパスワードをチェックしてみるとよいかもしれない。

cracklib-checkの実行例。ここではパスワード「password」は辞書に載っている、「1234」は短すぎる、「abababababab」は文字種が少なすぎるというダメ出しをもらっている。

強いパスワードを作るには

 弱いパスワードを使ってはいけないことは理解できたと思うが、では具体的に、強いパスワードはどのように作ったらよいのだろうか。お勧めは、パスワード生成用のツールを利用することだ。

 筆者は普段「apg」というツールを利用している。Ubuntuでは同名の「apg」パッケージをインストールすることで利用できる。

apgパッケージのインストール
$ sudo apt install -y apg

 apgコマンドを実行すると、ランダムな英数字と記号で構成されたパスワードの候補がいくつか表示される。

 apgのユニークな所は、デフォルトで「発音可能な」パスワードを生成する点だ。完全にランダムなパスワードというのは、人間にとっては覚えにくいものだ。もちろん、パスワード管理ソフトを使えば、パスワードの複雑さ自体は、それほど問題にはならないだろう。だがOSのログインパスワードや、パスワード管理ソフトのマスターパスワードのように、どうしても暗記を強いられるパスワードも存在する。

 そこでapgでは、複雑なパスワードでも覚えやすいよう、声に出せるパスワードを作成し、その読み方も表示してくれる。……まあ実際のところ、筆者はこれで、覚えやすいパスワードだと思ったことはないのだが。

apgコマンドの実行例。デフォルトで6つのパスワードを生成する。左側にパスワードの候補、右に括弧書きで読み方が表示される
$ 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を指定した例。完全にランダムな8~10文字のパスワードが表示された
$ 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小文字を含む
数字、大文字、小文字を必ず含む8文字のパスワードを生成する例
$ apg -M NCL -m 8 -x 8
8Oteadva
idack4Ol
Daytfav9
FoampEn2
OcNihed1
uphBelf9

 なお生成したパスワードを前述のcracklib-checkにパイプすることで、生成と同時に強度をチェックしてみるのもお勧めだ。

4文字から8文字の、記号を含まないパスワードを生成して、強度をチェックしてみた例
$ 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が内部でどのような処理を行なっているかは、こちらが参考になるので、興味があったら見てみよう。

筆者がプライベートで使っているYubiKeyセキュリティキー(青い方)と、NFC搭載でスマホでも簡単に利用できる会社用のYubiKey 5 NFC(黒い方)

 UbuntuではPAMと呼ばれる仕組みを用いてユーザー認証を行なっている。まずU2Fを利用可能にするため、以下のコマンドでPAMモジュールをインストールしよう。

libpam-u2fパッケージのインストール
$ sudo apt install -y libpam-u2f

 続いて、使用するYubiKeyを登録する。YubiKeyをUSBポートに挿入したら、以下のコマンドを実行しよう。2行目のpamu2fcfgコマンドを実行すると、YubiKeyの端子部分のLEDが点滅するので、指でタッチする。これで登録は完了だ。

pamu2fcfgコマンドで、YubiKeyをユーザーに関連づける
$ mkdir -p ~/.config/Yubico
$ pamu2fcfg > ~/.config/Yubico/u2f_keys
YubiKeyの利用が求められている時は、端子部分が点滅する。この状態で端子部分に触れれば、YubiKeyで認証を行うことができる

 PAMに関する設定は、/etc/pam.d以下にある。インストールしたU2FのPAMモジュールを使用するよう、各設定ファイルを書き換えよう。UbuntuへのGUIログインを管理しているのが「/etc/pam.d/gdm-password」だ。このファイルをテキストエディタで開き、以下の変更を加えよう。

/etc/pam.d/gdm-passwordファイルを編集する
$ sudo nano /etc/pam.d/gdm-password
認証にpam_u2f.soを利用する設定を追加する
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」オプションは不要だ。

/etc/pam.d/sudoと/etc/pam.d/sudo-iを書き換える
@include common-auth
@include common-account



@include common-auth
auth    required    pam_u2f.so          ← 「@include common-auth」の後にこの行を追加
@include common-account

 以後はsudoの実行時にも、パスワード入力の後にYubiKeyへのタッチを求められるようになる。

 さて、2回に渡ってさまざまなトピックを紹介してきたが、日常的なPCの利用においては、パッケージのアップデートやパスワードの適切な運用、二要素認証の導入など、基本的なことを心がけていれば十分だと言えるだろう。それよりも繰り返しになるが、信頼できないサイトにアクセスしない、不用意にファイルをダウンロードしないといった、ユーザー自身の対策が大切であることを忘れないでほしい。