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

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


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

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

世間では、お盆休み真っ盛りではないかと思われます。
お休みされている貴兄は、休日を満喫されていますでしょうか。
そうでない貴兄は、がんばってお仕事されていますでしょうか。

ちなみに、わたしは、後者に属します。
というのも、弊社には「お盆休み」という概念がないためです。
(あ、休みが少ない職場、というわけではなく、 1年のうち好きなところで休みをとっていいことになっています。)

この時期、オフィスに絡む場所はどこもかしこもすいていますので、 会社近辺でなにかをするには、非常に快適です。
ただ、どことなしか、家族の視線が冷たいようにも思われますが…。

まあ、世間に合わせてお盆に休みを取ってしまいますと、 どこもかしこも混んでいるに違いありません。
ですので、お盆休みが終わってほとぼりが冷めたころにぽんっと休んで、 静岡の大地で仁王立っているガンダムでも見に行ってこようと思います。

ただ、問題は、息子の夏休みの宿題が、そのころ佳境を迎えている可能性が非常に高い、 ということでしょうか…。

蛙の子は蛙だから仕方ないと思って、今回もはりきってまいりますよ。

今回のお題 - 暗号化ファイルシステムを使いやすくする

前回は、cryptsetup を使って、 ファイルシステムをごっそり暗号化して使う方法をご紹介しました。

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

ですが、毎回毎回、暗号化のアルゴリズムや鍵長などをオプションで指定して cryptsetup コマンドを実行するのは、ちょっと面倒ですよね。

そこで今回は、cryptsetup コマンドをなるべく簡単に実行できる方法について、 考えてみたいと思います。

以降では、前回と同様のUSBメモリを使用しております。
ハギワラシスコムの 512MB のUSBメモリを3つのパーティションに分け、 2つ目のパーティションを暗号化して使用します。
そうでない貴兄…がほとんどだと思いますが、その都度脳内で変換して、 読み進めていただけますと幸いです。

udev でcryptsetupを自動実行

まずは、udev を使って、対象のUSBメモリが挿入されたとき、 cryptsetup create を自動的に起動してみたいと思います。

udev とは、各種デバイスの挿入や抜去をLinuxカーネルが検出したとき、 それをカーネルから知らせてもらい、 デバイスファイルの生成などを行うための仕組みです。

以前、当メルマガでもネタにさせていただきましたが、今回 udev を使用してみたところ、 下記の内容はやや古くなっていることがわかりました。
いずれ、現状にあったものを、再度ネタにさせていただこうと思います。

Vol.114 - udev の仕組みを理解する
http://www.usupi.org/sysad/114.html
Vol.115 - udev の設定をカスタマイズする
http://www.usupi.org/sysad/115.html

 

…という話はまた後日させていただくとして、まずは、 対象のUSBメモリが挿入されたときに、判別できるかどうか確認してみましょう。

USBメモリに対する処理が記述されているファイルは、 /lib/udev/rules.d にある 60-persistent-storage.rules です。
これを、/etc/udev/rules.d にコピーします。
(ちなみに、シェルのプロンプトが # なのは、 root 権限が必要だということを表しています。 Ubuntuなどの貴兄は sudoコマンド経由で実行してくださいませ。)

  # cp -i /lib/udev/rules.d/60-persistent-storage.rules \
  /etc/udev/rules.d/

そして、 /etc/udev/rules.d/60-persistent-storage.rules のほうに手を加えていきます。
さて、上記ファイルの中に、以下の1行が含まれていると思います。

  KERNEL=="sd*|cciss*", ENV{DEVTYPE}=="partition", ENV{ID_SERIAL}=="?*", \
  SYMLINK+="disk/by-id/$env{ID_BUS}-$env{ID_SERIAL}-part%n"

この行は、USBメモリの各パーティションの存在をカーネルが認識した際に、 udevd が解釈して処理を行います。
ここで、 /usr/local/sbin/usb-cryptsetup.sh というスクリプトをついでに実行してもらうよう、 RUN+=云々... を最後に追加します。

  KERNEL=="sd*|cciss*", ENV{DEVTYPE}=="partition", ENV{ID_SERIAL}=="?*", \
  SYMLINK+="disk/by-id/$env{ID_BUS}-$env{ID_SERIAL}-part%n", \
  RUN+="/usr/local/sbin/usb-cryptsetup.sh"

まずは確認することが目的ですので、usb-cryptsetup.sh を、 以下の内容のスクリプトにしてみました。

#!/bin/sh
/bin/date >> /tmp/usb-cryptsetup.log
/usr/bin/printenv >> /tmp/usb-cryptsetup.log
echo >> /tmp/usb-cryptsetup.log

ご覧の通り、日時と環境変数の一覧を、 /tmp/usb-cryptsetup.log というファイルに追記していくだけのスクリプトです。
これを、いつものように実行可能にしておきます。

  # chmod +x /usr/local/sbin/usb-cryptsetup.sh

そして、対象のUSBメモリをぷすっと差します。
すると、/tmp/usb-cryptsetup.log に、 以下のような情報が吐き出されていることがわかります。
(以下は、主要な環境変数だけを抜粋しています。
また、下記を確認できましたら、USBメモリを抜いておきましょう。)

  ID_BUS=usb
  DEVNAME=/dev/sdb2
  ACTION=add
  UDISKS_PARTITION_NUMBER=2  
  ID_MODEL=UD-Pure
  ID_SERIAL=HAGIWARA_UD-Pure_985614010100-0:0
  UDISKS_PARTITION_SIZE=67371008
  ID_VENDOR_ENC=HAGIWARA
  ...
  (※ は、DKD_PARTITION_NUMBER の場合もあります)

つまり、以下の条件のときに、cryptsetup を実行すればよいということがわかります。

  ACTION = "add"
  ID_BUS = "usb"
  ID_SERIAL = "HAGIWARA_UD-Pure_985614010100-0:0"
  UDISKS_PARTITION_NUMBER もしくは DKD_PARTITION_NUMBER = "2"

それをふまえた usb-cryptsetup.sh は、以下の通りです。
(環境変数などは、もはやファイルに吐き出したりしません。)

#!/bin/sh
CRYPT_DEVN="HAGIWARA_UD-Pure_985614010100-0:0"
CRYPT_PART="2"              # /dev/sd?2
CRYPT_NAME="private1"       # 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}

最初の CRYPT_ で始まる5行は、対象のUSBメモリの各種パラメータです。
「CRYPT_DEVN」には、USBメモリのシリアル(ID_SERIAL)を指定します。
「CRYPT_PART」には、対象のパーティション番号を指定します。
「CRYPT_NAME」には、 アクセスする時に使用する名前(/dev/mapper/名前)を指定します。
「CRYPT_SPEC」には、暗号化のアルゴリズムを指定します。
「CRYPT_SIZE」には、鍵長を指定します。

これらを、ご使用の環境に合わせて変更されましたら、 再度USBメモリを挿入してください。
xterm が起動され、ウィンドウに以下が出力されていれば、成功です。
(いつものように、パスワードを入力してください。)

  Enter passphrase:

あとは、マウントして使うなり、自由にしていただければと思います。

 

ちなみに、抜去時に cryptsetup remove を自動的に実行させてみようとしましたが、 うまくいきませんでした。
抜去してデバイスがない状態では、以下のように叱られてしまいます。

  # cryptsetup remove private1
  Device (null) doesn't exist or access denied.

そして、以下のように亡霊として残ってしまいます。
ですので、udev に頼らず、自力でアンマウントして cryptsetup remove を行ってから、 デバイスを引っこ抜くようにしてくださいませ。

  # ls /dev/mapper/
  control  private1
  # cryptsetup status private1
  /dev/mapper/private1 is active:
    cipher:  aes-cbc-plain
    keysize: 256 bits
    device:  (null)
    offset:  0 sectors
    size:    131584 sectors
    mode:    read/write

Debian系だと、上記を使わなくてもできます

Debian系に限定されてしまいますが、別の方法がありますので、 さらっと紹介させていただきます。

まず、/etc/crypttab に、対象のパーティションの情報を記述します。
1行につき1つで、書式は以下の通りです。

  名前  デバイス  キーファイル  オプション

「名前」には、アクセスする際の名前(/dev/mapper/名前)を指定します。
「デバイス」には、元になるデバイスファイル名を指定します。
「キーファイル」には、パスワードが格納されたキーファイルを指定するのですが、 ここでは「none」を指定して、毎回入力するようにします。
「オプション」には、暗号化アルゴリズムや鍵長などを指定できます。
たとえば、「cipher」で暗号化アルゴリズム、 「size」で鍵長を指定することができます。また、 パスワードを2回入力して石橋を叩きたいという貴兄は、 「verify」をつけましょう。
そして、これらオプションを複数指定する場合は , で区切ります。

たとえば、前述と同じ条件で使用するには、以下を追加します。

  private1 /dev/sdb2 none cipher=aes-xts-plain,size=256

ですが、いつも /dev/sdb2 が割り当てられるとは限りません。
ですので、以下のようにしたほうがよいかもしれません。

  private1 /dev/disk/by-id/usb-HAGIWARA_UD-Pure_985614010100-0:0-part2 \
  none cipher=aes-xts-plain,size=256

さて、/etc/crypttab にエントリを追加しましたら、USBメモリを差した後、 以下を実行してください。
(先の udev の設定を試された貴兄は、自動で cryptsetup create が実行されないよう、 udev の設定を戻してからお試しください。)

  # /etc/init.d/cryptdisks restart (あるいは force-start)
   * Stopping remaining crypto disks...
   * test1 (stopped)...                                    [ OK ]
   * Starting remaining crypto disks...
   * test1 (starting)..
  Unlocking the disk  ()
  Enter passphrase:  (パスワードを入力)
   * test1 (started)...                                    [ OK ]

パスワードを入力しますと、cryptsetup create が実行され、特に問題がなければ、 後は自由にマウントなどできるのではないかと思います。

おわりに

以上、cryptsetup create を自動で呼び出す方法を、ご説明しました。

Debian系の場合の、もろもろの仕組みなどについては、きちんと調べきれなかったため、 同程度のことができたという内容にとどまっております。
(申し訳ございません…時間がなかったのです…というのは言い訳ですね…。)

いろいろできそうな匂いがしますので、全貌…あるいは片鱗が解明できた時点で、 おいおいご紹介させていただこうかなと思っております。
(というわけで、次回もまだ続きそうですよ…。)

宿題の答え

前回の宿題は、

  別のマシンで暗号化したものが読み書きできるか、試してみましょう。

でした。

ただ単に、とあるマシンで暗号化したものを、 別のマシンでも同じ手順で使えることを確認するだけです。

まず、とあるマシンに USBメモリを差し、以下のような手順で使えることを確認します。

  # cryptsetup create -y -c aes-xts-plain -s 512 private1 /dev/sda2
  Enter passphrase: (パスワードを入力)
  Verify passphrase: (同じパスワードを再度入力)
  # mkfs.ext3 /dev/mapper/private1  ←初回のみ実行
  # mount /dev/mapper/private1 /mnt
  (/mnt を読み書きする)
  # umount /mnt
  # cryptsetup remove private1

次に、別のマシンでも同手順で試します。
(手順は同じですので、実行例は割愛します。)

…ただ、上記では、aes-xts-plain を指定していますが、 カーネル2.6.24 以降でないと xts が使えません。
試しに、カーネル2.6.18 のマシンでやってみますと、 以下のように叱咤されてしまいました。

  # cryptsetup create -y -c aes-xts-plain -s 512 private1 /dev/sda2
  Enter passphrase: (パスワードを入力)
  Verify passphrase: (同じパスワードを再度入力)
  Command failed: device-mapper: reload ioctl failed: Invalid argument

ですので、ご使用のマシンに合わせて、 暗号化のアルゴリズムを選ぶ必要があるように思います。

また、デフォルトでは、アルゴリズムが aes-cbc-plain、 鍵長が 256bitになっています。
ですが、将来、バージョンアップの際に変更される可能性もありえます。
ですので、どちらも明示的に指定をしたほうが、 後々問題になりにくいのではないかと思います。

今回の宿題

今回の宿題は、

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

です。

本題で示した udev-cryptsetup.sh の場合、xterm 経由で cryptsetup を実行しますが、 cryptsetup が終了すると xterm も即効で終了するため、 正常に設定がされたかどうかがよくわかりません。

そこで、cryptsetup の実行結果がわかるよう、 udev-cryptsetup.sh を書き換えてみてください。

あとがき

実は、尋常でない量の私物を、会社に置いています。
ちょっとこの量はまずいだろう…ということに、いまさらではありますが気づきまして、 ちょこちょこ整理することにしました。
# 実は、きっかけになる出来事があったのですが、ここでは割愛します。

しかし、100人いたら 99.9人は同じ罠にかかると思われる、 懐かしいものが出てくるとパンドラの箱を開けてしまい作業が中断、 というスパイラルに何度も何度も陥っております。

たとえば、「日経Linux」の創刊前号なるものを、本棚で発見しました。
「日経ソフトウェア8月号増刊」とありますので、 日経ソフトウェアから生まれた雑誌だったのですね。 (ちなみに、1999年の8月号です。)
個人的には、日経ソフトウェアは新しい雑誌というイメージがありましたので、 見事に(?)覆された気分です。

などと思いながら、この頃から GNOME や KDE はあったんだなとか、 Javaそのものがホットな話題だったんだなあなどと、 ページをめくってはアーと奇声を発し、結局一冊を片付けるのに、 十数分費やしてしまいました。

他にも、IPミーティングの資料や、 NSUG(日本サン・ユーザー・グループ)の資料などが出てきて、 その度に中を確認しては感慨にふけってしまい、 案の定、私物の仕分けは、ほとんど進んでいません。

さらに、往年のワークステーション(SONYのbigNEWS、SPARCStation IPC、SGI Indy)が、 私物コーナーにドーンと鎮座されております。
このペースでは絶対終わらないと、諦めムードが漂ってまいりました。
# それもらってやるよっ! という奇特な方は…いませんよね…。

同じ部署に長く在籍していると、 なんやかんやで私物が蓄積されていくのではないかと思います。
思い当たる節のある貴兄は、上記のように手遅れとなってしまう前に整理されることを、 強く強くお勧めします。

 

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

 

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

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

「栗日記」- 妙なところで栗の絵の展示をする予定です。どきどき。
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

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本