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

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


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

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

毎年7月の最終金曜日は、「システム管理者の日」ですね。
今年は、一昨日の7月30日がそうでした。
システム管理を生業とされている貴兄は、ねぎらってもらえましたか?
(そうじゃない貴兄は、日頃の感謝の意を表しましたでしょうか?)

 

それはそれとして、某日経Linuxの連載が、予想に反してきっちり6回まで続き、 無事最終回を迎えることができました。
(8月7日の発売日までは、まだ終わったとは言えないかもしれませんが。)

そして、次の連載も、間髪入れずに始まるかもしれません。
今度のテーマは、昔取った杵柄的な内容ではありませんので、 大あわてで情報を集めつつ、いろいろ確かめたりしているところです。
(とはいえ、視界はまだ 2m 先くらいしか見えていません…やばいです。)

しかし、ちょっと先の読めない新しいことに挑戦するときは、 本当に実現できるだろうかとか、納期に間に合うだろうかといった緊張感が、 やる気のスイッチを入れてくれるように思います。
(あまりに無茶なゴールだと、逆効果になってしまうこともありますが。)

ですので、なにか新しい仕事などが舞い込んできて、やろうかどうか躊躇したときは、 脳ミソが言い訳をいろいろ考える前に、 「私がやります!」と答えてしまえばよいのではないかと思います。

わたしの場合、これを、本業でやらないといけないんですよね…。
自分で書いておきながら、そのことに今気づきました。

実践できてないことを自覚したところで、今回もはりきってまいります。

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

以前会社で、情報漏洩に関するビデオを見ました。

顧客情報の入ったノートパソコンを紛失してしまい、影響範囲が、 顧客や下請けなど連鎖的に広がっていくという、かなり恐ろしい内容でした。

そのビデオを見て、 なんでもかんでもファイルをノートパソコンに入れておくのはリスキーだということと、 どうしても持ち運ばなければいけない場合は暗号化すべきだということを、学びました。

前者に関しては、会社のルールや心がけなどにしたがえば、 そこそこ防ぐことができるのではないかと思います。 (普通は明文化されてますよね?)
後者に関しては、zip や gnupg、openssl などのコマンドを使うことで、 ファイル単位で暗号化することができます。

ですが、いちいちファイル毎にコマンドを実行するのも面倒ですよね。
ファイルシステム全体を暗号化して、 マウントするときだけパスワードを入力するだけになっていると、 簡単ですので末永く使えるのではないかと思います。

というわけで今回は、ファイルシステムをまるっと暗号化して使う方法を、 ご紹介したいと思います。

cryptsetup を使います

まず、暗号化したいものを用意します。
個人的には、手軽に持ち運べる記憶媒体がもっとも適していると思いますので、 USBメモリ を対象にしたいと思います。

ただし、ファイルシステムを一から構築する必要がありますので、 中身の入っているものは避けるか、 中身をどこかにコピーして消してしまってもよい状態にしてください。

そして、ファイルシステムを暗号化するために、 cryptsetup という名のコマンドを使用します。
そのため、Debian 系では cryptsetup、 RedHat 系では cryptsetup-luks というパッケージを、 たとえば以下の手順でインストールしておきます。

  # apt-get install cryptsetup   (Debian系の場合)
  # yum install cryptsetup-luks  (RedHat系の場合)

対象のパーティションはどれ?

試す前に、USBメモリを、ご使用のLinuxにぷすっと挿してみてください。

GNOME環境をお使いで、すでに使用可能なファイルシステムが存在するのであれば、 自動的にマウントしてくださると思います。
df コマンドを実行すると、 それらしきエントリが最後の方にあるのではないかと思います。
(それ以前に Nautilus のウィンドウがばんばん出現すると思いますが。)

  $ df
  Filesystem     1K-blocks      Used Available Use% Mounted on
  /dev/sda5      12345678K  9876543K  1851850K  84% /
  ...
  /dev/sdb1        126916K     1550K   118801K   2% /media/foo
  /dev/sdb3        295420K     2088K   293332K   1% /media/bar

わたしが挿したUSBメモリは、 ハギワラシスコムの Pureという 512MB のもので、 あらかじめパーティションを3つに分けてあります。
それが /dev/sdb に割り当てられており、 1つ目と3つ目のパーティションがマウントされていることが、 上記からそれとなくわかると思います。

dmesg コマンドでも確認できます。
やはり、/dev/sdb が3つのパーティションからなることがわかります。

  $ dmesg | tail
  ...
  sd 52:0:0:0: [sdb] Assuming drive cache: write through
   sdb: sdb1 sdb2 sdb3
  sd 52:0:0:0: [sdb] Assuming drive cache: write through
  sd 52:0:0:0: [sdb] Attached SCSI removable disk

また、sysfs を参照することで、 わたしの挿したUSBメモリが sdb に割りあてられていることの確証が得られます。

  $ cat /sys/block/sdb/device/vendor
  HAGIWARA
  $ cat /sys/block/sdb/device/model
  UD-Pure

というわけで、お察しの通り、/dev/sdb2 を空けてありますので、 これを暗号化の対象にしたいと思います。

もし、自動的にマウントされているパーティションを対象としたければ、 以下のように手動でアンマウントしてしまえばよいです。

  # umount /media/foo  (前述の /dev/sdb1 をアンマウントする場合)

暗号化ファイルシステムにする手順

それでは、ファイルシステムを暗号化してしまいたいと思います。

まず、「create」というアクションを指定して、cryptsetup コマンドを実行します。

  # cryptsetup create -y 名前 デバイスファイル

「デバイスファイル」には、暗号化の対象となるデバイスファイルを指定します。
たとえば、前述のように /dev/sdb2 を対象としたいなら、/dev/sdb2 を指定します。

「名前」には、暗号化の設定を行った後、アクセスする際に使用する名前を指定します。

上記を実行するとパスワードを聞いてきますので、 それなりに複雑で推測しにくいパスワードを入力してください。
また、上記では、「-y」オプションを指定していますので、 パスワードを再入力する必要があります。

たとえば、暗号化の対象が /dev/sdb2 で、private1 という名でアクセスしたい場合は、 以下のように実行します。

  # cryptsetup create private1 /dev/sdb2
  Enter passphrase: (パスワードを入力)
  Verify passphrase: (同じパスワードを再度入力)

最初のパスワードと2回目のパスワードが異なると、以下のメッセージが出力されて、 何も行われません。その際は、もう一度 cryptsetup create を実行してください。

  Passphrases do not match.

パスワードは、2回目以降使用する際に、絶対必要です。
ですので、忘れないよう脳ミソに刻み込んでください。
(そういう事情がありますので、打ち間違いなどを防ぐため、 create する際には -y オプションを必ずつけましょう。)

 

さて、create がうまくいきましたら、/dev/mapper/名前 ができていると思います。

  # ls /dev/mapper/
  control  private1

/dev/mapper/名前 を介してアクセスすると、 自動的に暗号化されて記録されるという寸法です。

また、create によって、カーネルの中の準備は行われますが、 USBメモリそのものに何か記録されるわけではありません。
/dev/mapper/名前 を介して書き込みを行った際に、 指定したパスワードを使って暗号化を行い、そのデータをUSBメモリに記録します。
(逆に、読み出すときには、 USBメモリのデータを復号化した結果をユーザに渡してくれます。)

 

では、ファイルシステムを作成してみましょう。
以下のように mkfs.ext3 (ext2 でも ext4 でも構いません) コマンドを実行して、 暗号化されたファイルシステムを作成します。

  # mkfs.ext3 /dev/mapper/private1

指定するデバイスが /dev/mapper/名前 である以外は、 通常の手順と何ら違いはありません。
ファイルシステムを構築したら、あとはマウントして使うだけです。

  # mount /dev/mapper/private1 /mnt
  # ls /mnt
  lost+found/

当たり前ですが、普通に使用できます。
以下では、test.txt というファイルを作成しています。

  # echo this is a test > /mnt/test.txt
  # cat /mnt/test.txt
  this is a test

 

使い終わったら、通常と同様にアンマウントしますが、 それだけではUSBメモリを引っこ抜けません。

  # umount /mnt

/dev/mapper/名前 を取り除くために、 「remove」アクションを指定して cryptsetup を実行する必要があります。

  # cryptsetup remove private1
  # ls /dev/mapper
  control

/dev/mapper/名前 がないことを確認してから、USBメモリを抜きます。

2回目以降の使い方

前述により、初回の使い方はご理解いただけたのではないかと思います。
では、次に使用する際には、どのような手順で行えばよいでしょうか。

パスワードなど暗号化に関する情報は、USBメモリには存在しません。
ですので、2度目以降も同じように create から始めます。
ただし、ファイルシステムは構築済ですので、 mkfs.ext3 などを実行する必要はありません。 (実行したらきれいさっぱりなくなってしまいます。)

  # cryptsetup create private1 /dev/sdb2
  Enter passphrase: (初回に入力したパスワードを入力)
  Verify passphrase: (同じパスワードを再度入力)
  # mount /dev/mapper/private1 /mnt
  # ls /mnt
  lost+found/  test.txt
  # cat /mnt/test.txt
  this is a test

先ほど試しに作った test.txt がありますね。
使い終わった後の処理も同様です。

  # umount /mnt
  # cryptsetup remove private1

create する際にパスワードを間違えると、間違った復号をしますので、 マウントに失敗します。

  # cryptsetup create private1 /dev/sdb2
  Enter passphrase: (間違ったパスワードを入力)
  Verify passphrase: (間違ったパスワードを再度入力)
  # mount /dev/mapper/private1 /mnt
  mount: you must specify the filesystem type

そんなときは、速やかに remove して、create からやり直しましょう。
(間違ったパスワードで create した後、/dev/mapper/名前 に書き込みを行わなければ、 ファイルシステムが破壊されることはありません。)

  # cryptsetup remove private1
  # cryptsetup create private1 /dev/sdb2
  Enter passphrase: (正しいパスワードを入力)
  Verify passphrase: (正しいパスワードを再度入力)
  # mount /dev/mapper/private1 /mnt

暗号化方式を変えてみる

ところで、どのような暗号化方式を使用しているのでしょうか。

暗号化方式も含めて、いまのもろもろの状態を確認するには、 「status」アクションを指定して cryptsetup コマンドを実行します。
たとえば、private1 の状態を知るには、以下のように実行します。

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

暗号化のアルゴリズムが AES(Advanced Encryption Standard)、 暗号利用モード(複数のブロックを暗号化する際に用いられる方式)が CBC(Cipher Block Chaining)、鍵長が 256bit であることがわかります。

ただ、現在では、CBC はあまりよい方式ではないとされています。
ですので、別の方式を使ってみたいと思います。
そのためには、create の際に、「-c」もしくは「--cipher」オプションを用いて、 暗号化方式を指定します。

  # cryptsetup create -y -c 暗号化方式 名前 デバイスファイル

「暗号化方式」には、3つのパートを - で連結したものを指定します。

最初のパートには「暗号化アルゴリズム」を指定します。
前述の aes の他に、blowfish や des などを指定できます。

2つ目のパートには「暗号利用モード」を指定します。
前述の cbc の他に、xts や ctr などを指定できます。
(厳密には、xts は 2.6.24 以降のカーネルで使用できます。)

3つ目のパートには…すみません、よくわかりませんが、 おそらくは初期化ベクトルを指定するのだと思います。
具体的には、前述の plain の他に、essiv が指定できるようです。
essiv の場合はハッシュ関数を使いますので、 : と使用するハッシュ関数を付加する必要があります。

たとえば、aes-xts-essiv:sha256 を使用する場合は、以下のように実行します。

  # cryptsetup create -y -c aes-xts-essiv:sha256 private1 /dev/sdb2

また、鍵の長さを変えることもできます。
デフォルトは 256bit ですが、「-s」もしくは「--key-size」オプションを使用して、 鍵の長さをbitで指定できます。
たとえば、/proc/crypto には、aes-xts-* に該当する以下のエントリがあります。

  name         : xts(aes)
  driver       : xts(aes-asm)
  module       : xts
  priority     : 200
  refcnt       : 1
  selftest     : passed
  type         : blkcipher
  blocksize    : 16
  min keysize  : 32
  max keysize  : 64
  ivsize       : 16
  geniv        : 

min keysize と max keysize が、鍵長の最小と最大を表します。
ただし、単位はバイトですので、bitにするには8倍する必要があります。
ということは、256〜512bit が指定可能だということがわかります。

ですので、他の条件が先ほどと同じで、鍵長を512bit にして使用したい場合は、 以下のように実行します。

  # cryptsetup create -y -c aes-xts-essiv:sha256 -s 512 private1 /dev/sdb2

もちろん、暗号化方式などを変更しますと、 いままでとは異なる暗号化・復号化がされますので、 以前の内容を参照することはできません。
ですので、方式を変更したいときは、 事前に中身をどこかへ退避しておく必要があります。ご注意ください。

おわりに

以上、cryptsetup による暗号化ファイルシステムの使い方などを、 簡単にご紹介しました。

当初の予定ではもっと進むはずだったのですが、予想より長くなりましたので、 きりのいいところで止めました。
ですので、次回は続きになる予定です。
(この調子だと、LUKS にたどり着くのは次々回でしょうか…。)

あ、あと、暗号化していても、マウントしっ放しだと、 だれでもアクセスできてしまいます。使うときに create してマウントし、 使い終わったら即座にアンマウントして remove しましょう。

最後に、ご参考までに、WikiPedia様のリンクを載せておきます。

暗号理論
http://ja.wikipedia.org/wiki/%E6%9A%97%E5%8F%B7%E7%90%86%E8%AB%96
暗号利用モード
http://ja.wikipedia.org/wiki/%E6%9A%97%E5%8F%B7%E5%88%A9%E7%94%A8%E3%83%A2%E3%83%BC%E3%83%89
初期化ベクトル
http://ja.wikipedia.org/wiki/%E5%88%9D%E6%9C%9F%E5%8C%96%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB

宿題の答え

前回の宿題は、

  様々なファイルシステムでケーパビリティが使えるか、試しましょう。

でした。

ぱっと試せる、 ext2, ext3, ext4, vfat, ntfs, iso9660 および nfs で確認してみました。

ext2〜4 および vfat は、ループバックデバイスで確認しました。
手順はほぼ共通で、以下の通りです。
(2行目で実行したコマンドは、 mkfs.ext2, mkfs.ext3, mkfs.ext4 および mkfs.vfat です。)

  # dd if=/dev/zero of=zfs.img bs=1k count=1024
  # mkfs.ファイルシステム名 zfs.img
  # mount -o loop zfs.img /mnt
  # cp /bin/ls /mnt/
  # setcap cap_dac_read_search=ep /mnt/ls
  (ここでエラーにならなければ成功)
  # getcap /mnt/ls
  (ここでエラーにならず、設定内容が正しく出力されれば成功)
  # umount /mnt

ext2〜4 は、setcap および getcap コマンドの出力結果が以下のようになりました。 成功です。

  # setcap cap_dac_read_search=ep /mnt/ls
  # getcap /mnt/ls
  /mnt/ls = cap_dac_read_search+ep

ですが、vfat では文句を言われてしまいました。こちらは失敗です。

  # setcap cap_dac_read_search=ep /mnt/ls
  Failed to set capabilities on file `/mnt/ls' (Operation not supported)
  ...
  # getcap /mnt/ls
  Failed to get capabilities of file `/mnt/ls' (Operation not supported)

 

次に、ntfs です。

こちらは、正真正銘のブロックデバイスでないと叱られます。ですので、 USBメモリで試しました。
以下は、/dev/sdb3 を使用した場合の例です。
mkntfs コマンドでファイルシステムを構築する他は、同様の手順です。
setcap および getcap コマンドの結果を見ますと、成功していることがわかります。

  # mkntfs /dev/sdb3
  Cluster size has been automatically set to 4096 bytes.
  Initializing device with zeroes: ...略...
  Creating NTFS volume structures.
  mkntfs completed successfully. Have a nice day.
  # mount /dev/sdb3 /mnt
  # cp /bin/ls /mnt
  # setcap cap_dac_read_search=ep /mnt/ls 
  # getcap /mnt/ls
  /mnt/ls = cap_dac_read_search+ep
  # umount /mnt

 

そして次は、iso9660 です。(CD-ROM のファイルシステムです。)
書き込みができませんので、 先に setcap で設定しておいてから mkisofs コマンドでイメージにしています。
…ご覧のように、叱られております。

  # mkdir iso
  # cp /bin/ls iso/
  # setcap cap_dac_read_search=ep iso/ls
  # getcap iso/ls
  iso/ls = cap_dac_read_search+ep
  # mkisofs -r -J -o isofs.img iso
  # mount -o ro,loop isofs.img /mnt
  # getcap /mnt/ls 
  Failed to get capabilities of file `/mnt/ls' (Operation not supported)
  # umount /mnt

 

最後は、nfs です。
NFSサーバ(nfsserver)の /export/path を mount して試していますが、 以下のように失敗しております。

  # mount nfsserver:/export/path /mnt
  # cp /bin/ls /mnt
  # setcap cap_dac_read_search=ep /mnt/ls 
  Failed to set capabilities on file `/mnt/ls' (Operation not supported)
  ...
  # getcap /mnt/ls
  Failed to get capabilities of file `/mnt/ls' (Operation not supported)
  # umount /mnt

/etc/exports の設定では no_root_squash をつけていますので、 root の権限で実行されているはずです。
また、NFSサーバ/クライアントともに、 2.6.25 以降のバージョンのLinuxカーネルを使用しています。

 

以上、結果をまとめますと、以下の通りです。
(個人的には、ntfs と nfs が意外でした。)

ケーパビリティが使える: ext2, ext3, ext4, ntfs
ケーパビリティが使えない: vfat, iso9660, nfs

他に気になるファイルシステムがありましたら、上記のような手順で確認してみましょう。

今回の宿題

今回の宿題は、

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

です。

暗号化方式やパスワードなどの条件が一致していれば、 別のマシンで使用していたものでも、基本的には利用できるはず…ですよね。

もし可能でしたら、違うディストリビューションのマシンや、 カーネルのバージョンが異なるマシンで確認してみてください。

あとがき

システム管理が半分本業だったころは、セキュリティに関する本を探して読む、 ということを一時期熱心にやっていました。
しかし、何冊か読んでいると、内容が重複しているので、こんなもんかなと思い、 そのうち読まなくなってしまいました。

とはいえ、セキュリティに関する技術もトレンドも、日々変わっていきますので、 昔読んだことが無駄ではないにしても、昔の常識がいまも通用するとは限りません。

というわけで、いま、「セキュリティの神話」という本を読んでいます。

セキュリティの神話 : John Viega, 葛野 弘樹(監訳), 夏目 大
http://www.amazon.co.jp/exec/obidos/ASIN/4873114519/usupiorg06-22

泣く子も黙る McAfee の前副社長で、現SaaS部門のCTOのひとが書いた、 セキュリティに関するエッセイのような本です。

「神話」と書かれている通り、 一般的にこうだと思われていることが実は偽りなんだということを、 比較的わかりやすく述べてくださっています。

いま明かされる衝撃的な新事実!が書かれているわけではありませんが、 言われてみればそうだなあということに、結構気づかされます。

たとえば、オープンソースのほうが安全とは限らない (すべてのソースがチェックされているわけではない)とか、 結局コード数が少ないほど安全だと言えるとか、 クリック水増しへの対策を施さないことがコンピュータ犯罪を助長させているとか…。

セキュリティに関する具体的な技術や方法が書かれているわけではないのですが、 さまざまな視点でセキュリティについて考えようと思う貴兄は、 一度目を通してみてはいかがでしょうか。

ところで、アマゾンのカスタマーレビューには、誤植が多いという指摘がありましたが、 わたしはほとんど気づきませんでした。
多少なりとも文章を書く人間として、ちょっとヘコみました…。

 

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

 

「いますぐ実践! 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

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本