いますぐ実践! Linuxシステム管理

[バックナンバーのトップへ] [Linux システム管理のトップへ]


いますぐ実践! Linux システム管理 / Vol.186 / 読者数:1602名

こんばんは、うすだです。

いつもと違って1週間余分に猶予をいただいていたはずが、 いまのお仕事がデスマーチ的な様相を帯びてまいりまして、 あれやこれやとしている間に週末がやってきてしまいました。

ところで、期限間際に開発人員を追加するという手段は、 オーバーヘッドが発生してしまうため逆効果だ、という話をよく耳にします。

ですが、実際に自分がその渦中にいますと、 マネージャがそうしたくなる気持ちもよくわかります。

結局、人を追加する以外の手段を思いつかなければ、 状況が悪くなるかもしれないとわかっていても、 何も手を打たないよりはいいかもしれない、 と藁をつかんでしまうからではないかと思います。

そんなようなことを考えながら、このせっぱ詰まった状況の中、 逃避行動の一環としてメルマガを書いている次第です。

前置きはこのくらいにして、今回もはりきってまいりますよー。(空元気)

今回のお題 - 暗号化ファイルシステムを使ってみる 〜 LUKS 編

前回および前々回では、cryptsetup を使って、 ファイルシステムを暗号化する方法について、あれこれご紹介しました。

Vol.184 - 暗号化ファイルシステムを使ってみる
http://www.usupi.org/sysad/184.html
Vol.185 - 暗号化ファイルシステムを使いやすくする
http://www.usupi.org/sysad/185.html

今回は、これらの集大成(?)となる、LUKS をご紹介したいと思います。

LUKS とは?

LUKS(Linux Unified Key Setup) とは、暗号化ファイルシステムの標準的な仕様です。

前回と前々回でご紹介した方法を用いれば、 ファイルシステムの暗号化を行えます。
ただ、暗号化の方式やパスワードが記録されませんので、 前回使用した際の方式やパスワードとは違うものを使用してしまっても、 それが間違いだということに気づけません。

ですが、LUKS では、方式やパスワードなどの情報が記録されていますので、 間違ったやりかたでやろうとすると、間違ってますよと親切に教えてくださいます。

…ものすごく大雑把な説明ですみません。
詳しくは、cryptsetup の公式ページや wikipedia などをご覧ください。

cryptsetup - Project Hosting on Google Code
http://code.google.com/p/cryptsetup/
LUKS - Wikipedia
http://ja.wikipedia.org/wiki/LUKS

とにかく使ってみます

今回使用するコマンドは、おなじみの cryptsetup コマンドです。
ですので、新たになにか用意する必要はありません。

また、対象とするパーティションは、以前と同様、/dev/sdb2 です。
実際に試すときには、適時置き換えて実行してくださいませ。

 

それでは、早速使ってみましょう。

さて、まずはじめに行うのが、初期化です。
LUKS の初期化を行うためには、 「luksFormat」というアクションを指定して cryptsetup コマンドを実行します。
基本的には、対象のパーティションを指定するだけです。

  # cryptsetup luksFormat デバイスファイル

以前と同様に、「-c」オプションや「-s」オプションを使用して、 暗号化方式や鍵の長さを指定することもできます。

  # cryptsetup -c 暗号化方式 -s 鍵長 luksFormat デバイスファイル

実行してみますと、ちょいと大げさな警告とともに、念を押されます。
中身がきれいさっぱり消えて LUKS として生まれ変わらせてよいと思った貴兄は、 YES と「大文字」で答えてください。
…そうでない貴兄は、バックアップを取るなどの対処をしてください。

  # cryptsetup -c aes-xts-plain -s 256 luksFormat /dev/sdb2

  WARNING!
  ========
  This will overwrite data on /dev/sdb2 irrevocably.

  Are you sure? (Type uppercase yes): 

YES と答えますと、例によって例のごとく、パスワードを聞かれます。
以前とは違い、-y オプションなしでもちゃんと2回聞いてくれます。 安全なパスワードを入力してください。

  ...
  Are you sure? (Type uppercase yes): YES
  Enter LUKS passphrase: (パスワードを入力)
  Verify passphrase: (パスワードを再度入力)

これで、初期化は完了です。

引き続きまして、「luksOpen」というアクションで、 初期化済の LUKS のパーティションを開きます。

  # cryptsetup luksOpen デバイスファイル 名前

実行しますと、パスワードを聞かれます。
初期化時に入力したパスワードを入力してください。

  # cryptsetup luksOpen /dev/sdb2 luks2
  Enter passphrase for /dev/sdb2: (パスワードを入力)
  Key slot 0 unlocked.

これで、/dev/mapper にファイルが出現します。

  # ls /dev/mapper/
  control luks2

後は、いつものように使うことができます。
たとえば、ext3 なファイルシステムを作成して /mnt にマウントして、 test.txt というファイルを作成するには、以下のように実行します。
(最後、アンマウントまでやっちゃっています。)

  # mkfs.ext3 /dev/mapper/luks2
  # mount /dev/mapper/luks2 /mnt
  # ls /mnt
  lost+found
  # echo This is a test > /mnt/test.txt
  # ls /mnt
  lost+found  test.txt
  # cat /mnt/test.txt
  This is a test
  # umount /mnt

使い終わったら、「luksClose」というアクションで閉じます。
これを忘れて USB メモリなどを抜いてしまうと、亡霊が残りますので、 必ず実行するようにしましょう。

  # cryptsetup luksClose 名前

実行しますと、/dev/mapper からファイルが消え去ります。
これで、安心して USBメモリを引っこ抜けます。

  # cryptsetup luksClose luks2
  # ls /dev/mapper/
  control

パスワードを追加できます

さて、LUKS では、設定できるパスワードが、1つに限られません。
後から追加したり削除したりできます。

パスワードを追加するには、「luksAddKey」アクションを使用します。

  # cryptsetup luksAddKey デバイスファイル

実行しますと、設定済のパスワードを聞かれますので、入力します。
すると、初期化時と同様、新しいパスワードを2回聞かれますので、 同様に安全なパスワードを入力してください。

  # cryptsetup luksAddKey /dev/sdb2
  Enter any passphrase: (既存のパスワードを入力)
  Key slot 0 unlocked.
  Enter new passphrase for key slot: (新しいパスワードを入力)
  Verify passphrase: (新しいパスワードを再度入力)

すると、新しいパスワードが追加されて、使えるようになります。
試しに、luksOpen 時に新しいパスワードを入れてみましょう。

  # cryptsetup luksOpen /dev/sdb2 luks2
  Enter passphrase for /dev/sdb2: (新しいパスワードを入力)
  Key slot 1 unlocked.

ちゃんと処理されているようです。
ここで、最後の Key slot とやらが 1 になっていることがわかります。
ちなみに、初期化時のパスワードを入力しますと、0 と出力されます。
このスロット番号は、登録したパスワードを無効にする際必要ですので、 頭の片隅に記憶しておきましょう。

 

パスワードを無効にするには、 「luksKillSlot」アクションというものを使用します。
デバイスファイルと、前述のスロット番号を指定します。

  # cryptsetup luksKillSlot デバイスファイル スロット番号

たとえば、スロット番号0(初期化時に設定したパスワード)を無効にするため、 以下のように実行してみましょう。
パスワードを聞かれますが、 ここではスロット番号0 以外のパスワードを入力してください。 (たとえば、さっき追加したパスワードですね。)
うまくいけば、以下のような出力が得られます。

  # cryptsetup luksKillSlot /dev/sdb2 0
  Enter any remaining LUKS passphrase: (消さないパスワードを入力)
  Key slot 1 unlocked.
  Key slot 1 verified.

その他いくつか

上記の他に、必要となりそうなアクションを、いくつかご紹介します。

まず、「isLuks」というアクションは、 指定したデバイスファイルがLUKSなパーティションかどうかを調べるためのものです。

  # cryptsetup isLuks デバイスファイル

実行しますと…なにも出力されません。

  # cryptsetup isLuks /dev/sdb2

実は、ステータスコードで判別します。
0 だと LUKS で、0 以外だと LUKS ではありません。
たとえば、LUKS なパーティションを指定して実行しますと、 ちゃんと 0 が入っています。

  # cryptsetup isLuks /dev/sdb2
  # echo $?
  0

LUKS でないパーティションで試しますと、0 でない値になっています。

  # cryptsetup isLuks /dev/sdb1
  # echo $?
  234

&& や || を使うと、わかりやすいかもしれません。

  # cryptsetup isLuks /dev/sdb2 && echo LUKS || echo NOT-LUKS
  LUKS
  # cryptsetup isLuks /dev/sdb1 && echo LUKS || echo NOT-LUKS
  NOT-LUKS

 

あとひとつ、「luksDump」アクションをご紹介します。
以前ご紹介した「status」と似ていますが、スロットの状態などがわかるところが、 やや便利ではないかと思います。

  # cryptsetup luksDump /dev/sdb2
  LUKS header information for /dev/sdb2

  Version:           1
  Cipher name:       aes
  Cipher mode:       xts-plain
  Hash spec:         sha1
  Payload offset:    2056
  MK bits:           256
  ...
  Key Slot 0: DISABLED
  Key Slot 1: ENABLED
      Iterations:    138183
      Salt:          00 11 22 33 ...
      ...
  Key Slot 2: DISABLED
  Key Slot 3: DISABLED
  ...

さきほど、スロット番号 0 を消しましたので、1 だけが有効であることがわかります。

ちなみに、status アクションを実行すると、以下のようになります。

  # cryptsetup status luks2
  /dev/mapper/luks2 is active:
    cipher:  aes-xts-plain
    keysize: 256 bits
    device:  /dev/sdb2
    offset:  2056 sectors
    size:    129528 sectors
    mode:    read/write

おわりに

以上、暗号化ファイルシステムの LUKS 編をご紹介しました。

LUKS を知ってしまった以上、もう LUKS を使うしかないと思いますが、 いずれにしましても、漏洩するとよろしくないデータは、 必ず暗号化して保管するよう心がけましょう。

ちなみに、Wikipedia などによると、Windows でも使えると書いてあります。
今回は、そんな時間がありませんでしたが、機会があれば試してみようと思います。

宿題の答え

前回の宿題は、

  cryptsetupの結果がわかるよう、udevのスクリプトを改良しましょう。

でした。

すぐに xterm を終了させなければいいわけですよね。
というわけで、そんなスクリプトを書いてみました。

  #!/bin/sh
  CRYPT_DEVN="HAGIWARA_UD-Pure_985614010100-0:0"
  CRYPT_PART="2"              # /dev/sd?2
  CRYPT_NAME="test1"          # name
  CRYPT_SPEC="aes-cbc-plain"  # cipher specification string
  CRYPT_SIZE="256"            # key size

  [ "$ACTION" = "add" ] || exit 0
  [ "$ID_BUS" = "usb" ] || exit 0
  [ "$ID_SERIAL" = "$CRYPT_DEVN" ] || exit 0
  [ -n "$DKD_PARTITION_NUMBER" ] \
      && n=$DKD_PARTITION_NUMBER || n=$UDISKS_PARTITION_NUMBER
  [ "$n" = "$CRYPT_PART" ] || exit 0
  /usr/bin/xterm -display :0 \
      -e "/sbin/cryptsetup create -y -c $CRYPT_SPEC \
          -s $CRYPT_SIZE $CRYPT_NAME \
          /dev/disk/by-id/${ID_BUS}-${ID_SERIAL}-part${n} \
          && echo OK || echo NG; read"

前回の本題でご紹介したスクリプトとほぼ同じです。

異なる箇所は、 最後に実行する xterm の -e オプションで指定した実行内容です。
cryptsetup コマンドが無事実行されれば OK を、失敗すれば NG を出力し、 何か入力されるのを read コマンドで待ちます。

echo じゃあつまらないとお嘆きの貴兄は、 xmessage などに置き換えてもよろしいのではないかと思われます。
(メッセージの内容が、相変わらず殺風景すぎますが…。)

  #!/bin/sh
  CRYPT_DEVN="HAGIWARA_UD-Pure_985614010100-0:0"
  CRYPT_PART="2"              # /dev/sd?2
  CRYPT_NAME="test1"          # name
  CRYPT_SPEC="aes-cbc-plain"  # cipher specification string
  CRYPT_SIZE="256"            # key size

  [ "$ACTION" = "add" ] || exit 0
  [ "$ID_BUS" = "usb" ] || exit 0
  [ "$ID_SERIAL" = "$CRYPT_DEVN" ] || exit 0
  [ -n "$DKD_PARTITION_NUMBER" ] \
      && n=$DKD_PARTITION_NUMBER || n=$UDISKS_PARTITION_NUMBER
  [ "$n" = "$CRYPT_PART" ] || exit 0
  /usr/bin/xterm -display :0 \
      -e "/sbin/cryptsetup create -y -c $CRYPT_SPEC \
          -s $CRYPT_SIZE $CRYPT_NAME \
          /dev/disk/by-id/${ID_BUS}-${ID_SERIAL}-part${n} \
          && /usr/bin/xmessage -display :0 OK \
          || /usr/bin/xmessage -display :0 NG"

スクリプトのご紹介ばっかりになってしまいましたが、以上です。

今回の宿題

今回の宿題は、

  LUKS で、どれだけパスワードを追加できるか、試してみましょう。

です。

…ええ、そんなに必要とはしないと思うのですが、純粋に、 どのくらいで上限に達するのか、確かめてみたいなと思った次第です。

ただ、ファイルシステムの容量によって上限が違う、 という可能性はあるかもしれません。

実践! ですので、ソースを眺めるよりも、まず実際に試してみましょう。

あとがき

パスワードの管理は、昔から、 個人レベルでも管理者レベルでも悩みの種であるように思います。

すべてをひとつのパスワードで統一すると楽ですが、万が一どこかで漏洩すると、 すべてが危険に晒されます。

かといって、パスワードを別々にしますと、 忘れてしまうというリスクが指数関数的(注: 個人的な感覚です)に増大してしまいます。

そのあたりのバランスをとってやるのが一番よいのだろうなと思います。
ですが、肝心のパスワードの強度はどうなのか、という問題は依然として残ったままです。

時代によって尺度が違うにしても、今使っているパスワードが、どの程度安全なのか、 ぱっとわかるといいのにと思っていましたら、タイムリーな記事がありました。

パスワードの強さをチェックする簡単な方法
http://journal.mycom.co.jp/articles/2010/09/02/password-strength-check/

実際のサイトは以下です。
なにはともあれ、開いてみてください。

How Secure Is My Password?
http://howsecureismypassword.net/

パスワードを打ち込みますと、どの程度の期間で破られるかというのを、 具体的な時間で教えてくれます。

肝となるスクリプトも公開されています。

http://howsecureismypassword.net/passwordstrength.js

比較的単純な計算しかしていないように見えますが、結果が具体的な数値となって現れ、 しかもいまの感覚にそこそこ合っているのであれば、十分有用ではないかと思います。 考えたひとはえらいですね。

困難なことを成し遂げるのはすばらしいことです。
ただ、難しくなくても、ちょっとしたヒラメキを実現して、 ちょっとした手助けになることをするのも、同様にすばらしいことだと思います。

というわけで、あれこれ難しく考えて深みにハマってしまったときには、 まずできることから少しずつやってみようと思います。

 

今回も、ここまで読んでいただき、誠にありがとうございました。
次回は、9月19日(日) の未明にお会いしましょう!

 

「いますぐ実践! Linux システム管理」の解除は、以下からできます。
http://www.usupi.org/sysad/ (まぐまぐ ID:149633)

バックナンバーは、こちらにほぼ全部そろっています。
http://www.usupi.org/sysad/backno.html

「栗日記」- 10月に、とあるところで展示をやることになりましたよー。
http://www.usupi.org/kuri/ (まぐまぐ ID:126454)
http://usupi.seesaa.net/ (栗日記ブログ)
http://usupi.org/k/ (モバイル栗日記)


[バックナンバーのトップへ] [Linux システム管理のトップへ]

トップ

バックナンバー
    [日付順] [目的別]

プロフィール

▼ リンク

独学Linux
Linuxデスクトップ環境に関する情報が満載です。 メルマガもありますよ。
Server World
CentOS 6をサーバとしたときの設定例が、これでもかというくらいたくさん載っています。 CentOS以外のディストリビューション(Fedora, Ubuntu)も充実しています。
LINUXで自宅サーバーを構築・導入(Fedora9)
Fedora9のインストールの仕方から管理方法まで、詳しく載っています。 SearchManには情報がもりだくさんです。
マロンくん.NET
〜サーバ管理者への道〜
Linuxをサーバとして使用するための、いろいろな設定方法が載っています。 マロンくんもかわいいです。 なんといっても、マロンくんという名前がいいですね!!
日経Linux
今や数少なくなってしまったLinuxの雑誌。ニュースやガイドもあります。
Linux Square − @IT
@ITが提供する、Linux の情報が満載。 載っていない設定方法はないんじゃないでしょうか。
gihyo.jp…技術評論社
Linuxに限らず様々な技術情報が満載のサイト。 SoftwareDesign誌も、 ソフトウェア技術者は必見です。
SourceForge.JP Magazine
Linux に限らず、オープンソース関連の記事が網羅されています。
ITmediaエンタープライズ:Linux Tips 一覧
Tips というより FAQ 集でしょうか。わからないことがあれば覗きましょう。
IBM developerWorks : Linux
開発者向けですが、勉強になりますよ。
Yahoo!ニュース - Linux
Yahoo!のLinuxに関するニュース一覧です。
栗日記
システム管理とかと全然関係ありませんが、毎日栗の絵を描いています。
システム管理につかれちゃったとき、癒されたいときに、ご覧ください。:-)
WEB RANKING - PC関連
ランキングに参加してみました。押してやってください。

▼ 作ってみました

Add to Google

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本