Ubuntu Weekly Recipe

第28回アーカイブの作成:圧縮ファイルの取り扱いと暗号化

そろそろ夏休みの季節ですが、旅行や帰省の際にもPCを手放せない、という方は多いのではないでしょうか。そうした場合、PCそのものを持ち歩くのは面倒ですから、USBメモリなどにデータを保存した状態で持ち歩くことになるでしょう。大量のファイルを持ち歩く場合、ディレクトリ単位で圧縮しておく方が使い勝手が良いですし、重要なデータであれば暗号化して持ち歩く方が安全です。今回はファイル単位での暗号化や、圧縮ファイルの取り扱いについて触れます。

File Rollerによるファイルの圧縮

Ubuntuでは標準的なファイル圧縮の方法として、ファイルやディレクトリを右クリックして利用できる、⁠書庫の作成]というメニューが用意されています図1⁠。これはFile Rollerという実装です。

図1 ⁠書庫の作成]メニュー
図1 [書庫の作成]メニュー

ごく一般的な用途であれば、File Rollerから圧縮ファイルを作成するだけで十分でしょう図2⁠。

図2 File Roller
図2 File Roller

File Rollerへの圧縮形式の追加

File Rollerは便利な機能ですが、標準では対応しているアーカイブ形式がそれほど多くありません。幾つかの追加パッケージを導入することで、対応形式を増やすことができます。以下のコマンドを利用するか、Synapticから該当するパッケージをインストールしてください。

$ sudo apt-get install lha-sjis 
$ sudo apt-get install p7zip-full
$ sudo apt-get install rar unrar

これらは順に、LHA・7ZIP・RARに対応します。インストール後にFile Rollerを開くと、対応形式が増えているのが分かるでしょう図3⁠。

図3 対応形式が増えた状態
図3 対応形式が増えた状態

.cabの展開

File Roller以外の形式を取り扱いたい場合は、どうしても端末から操作を行う必要があります。代表的なのは、Windows環境で標準的なアーカイブ形式の一つとして、Microsoft Cabinet形式(.cab)です。これらはターミナル上で扱う必要があります。

.cabファイルを扱うためのソフトウェアは標準ではインストールされていませんので、次のコマンドでパッケージをインストールするか、Synapticからパッケージを導入してください。

$ sudo apt-get install lcab cabextract

インストール後は、次のように操作することでファイルを.cab形式で圧縮できます。以下の例では、casket/ディレクトリ以下をcasket.cabファイルに格納しています。

$ lcab -r casket/ casket.cab

.cabファイルの展開は次のように行います。通常、Ubuntu環境でわざわざCabinet形式のファイルを作成することは少ないので、利用するのはこちらの方が多いでしょう。

$ cabextract casket.cab

ただし、cabextractコマンドではWindows向けのインストーラソフトウェアであるInstall Shiledが利用するCabファイルは扱うことができません。Install Shiledが利用しているものは同じ拡張子を利用する別の形式です。

tar・ZIPの使い分け

Ubuntu環境同士やWindowsとのやりとりであれば、多くの場合はZIPかtar.gzにするのが便利でしょう。使い分けは次のように考えるのが良いでしょう。

まず、ZIPはWindows XP/Vista環境であれば標準でファイルを展開することができます。標準状態のWindowsとのやりとりを行う場合に大変便利です。また、Windows以外のOSであっても、おそらくZIPを展開する手段は準備されているはずです。Ubuntu以外の環境とファイルをやりとりする場合は、ZIPにするのが無難でしょう。ただし例外として、商用Unix環境ではソフトウェアを追加しなければファイルを展開できないことがあります。

これに対して、tarはWindows環境では何らかのアーカイバが導入されていなければ展開できません。代わりに、Unix系の環境であれば、利用できないことはほとんどないでしょう。相手がUnix系の環境を利用していることが分かっているなら、こちらを利用するのが安全です。

また、前述のp7zip-fullが導入されており、また、Windows環境にも7ZIPが導入されていれば、ZIPの代わりに7ZIPを使うことで、おおむね10~20%程度ファイルサイズを小さくすることができます。うまくいくと、最大で30~50%圧縮できることもありますので、環境が整っていれば試すのも良いかもしれません。

ファイルの暗号化

パスワード付きZIPの作成

ここまではファイルの圧縮について触れましたが、Ubuntuでファイルを暗号化するにはどうすれば良いのでしょうか。

比較的単純な方法は、ZIPコマンドをコマンドラインで用い、パスワード付きのZIPファイルを作成することです。これは次のように操作することで行えます。以下はcasket/ディレクトリを、casket.zipというパスワード付ZIPファイルにアーカイブしています。

$ zip -r -e casket.zip casket/
Enter password: (パスワードを入力; 入力した文字は表示されません)
Verify password: (再度パスワードを入力; 入力した文字は表示されません)

ただし、ZIPのパスワードによる暗号化は強固ではなく、辞書攻撃を行うツールが存在しています[1]⁠。

現在のPCの性能は非常に高いため、現実的な時間でパスワードを解読することが可能です。⁠どうしても開こうと思わなければ見ることができない」といった程度の、気休め的な強度だと考えるのが良いでしょう。重要なデータの場合はこの方法以外の暗号化を用いる必要があります。

OpenSSLによる暗号化

Ubuntuを始めとするLinux・Unix環境であれば、多くの環境でOpenSSLパッケージが利用できるはずです[2]⁠。OpenSSLはSSL/TLS関連の機能を提供するライブラリですが、単純なファイルの暗号化にも利用できます。

実際に利用する場合、端末から次のように操作します。以下はcasket.zipファイルをAES128bitで暗号化し、元のファイル名+.encというファイル(casket.zip.enc)に保存しています。

$ FILE=casket.zip; openssl enc -e -aes-128-cbc -in ${FILE} -out ${FILE}.enc
enter aes-128-cbc encryption password:(パスワードを入力; 入力した文字は表示されません)
Verifying - enter aes-128-cbc encryption password:(パスワードを入力; 入力した文字は表示されません)

暗号化したファイルを複合する(元に戻す)には、次のコマンドを用います。

$ FILE=casket.zip; openssl enc -d -aes-128-cbc -in ${FILE}.enc -out ${FILE}
enter aes-128-cbc decryption password:(パスワードを入力; 入力した文字は表示されません)

このままでは日常的な利用には面倒ですので、ラッパーを準備して利用するのが良いでしょう。きわめて単純な例は次の通りです。このシェルスクリプトをaes128.shなどという名前で保存し、chmod +xして利用します。

#!/bin/bash

FILE=$1
INFILE=${FILE}
OPT="-e"

echo ${FILE} | egrep -q ".enc$" && OPT="-d"

if [ ${OPT} = "-d" ] ; then
        OUTFILE="${FILE%.enc}"
else
        OUTFILE="${FILE}.enc"
fi

if [ ${FILE} ] ; then
        openssl enc $OPT -aes-128-cbc -in "${INFILE}" -out "${OUTFILE}"
else
        echo "Input file not found."
        exit 1
fi

このスクリプトは以下のように、ファイル名の末尾が.encで終わっている場合は復号、それ以外の場合は暗号化を行います。

$ ./aes128.sh casket.zip
enter aes-128-cbc encryption password:
Verifying - enter aes-128-cbc encryption password:

$ ./aes128.sh casket.zip.enc
enter aes-128-cbc decryption password:

vimの簡易暗号化機能

エディタとしてvimを利用している場合、vimに内蔵された簡易暗号化機能を利用することができます。この暗号化機能はパスワード付ZIPアーカイブと同じものですので強固なものではありませんが、特に意識せずに利用することができるので、非常に便利でしょう。

利用法は単純で、vimのコマンドモード上で :X と入力し、パスワードを設定します図4⁠。以降はvimでそのファイルを開くたびにパスワードが確認されるようになります。保存などの編集操作は通常通り行えますので、ほとんど意識せずにファイルを扱うことができるでしょう。

図4 vimによる暗号化
図4 vimによる暗号化

GnuPGによる暗号化

ファイルやディレクトリを右クリックした際、⁠暗号化]というメニューに気づいたかもしれません。これはGPGによる暗号化機能です。この機能を用いることで、公開鍵暗号により、非常に強力な暗号化が行えます。

今回は公開鍵暗号方式の原理の説明は行いませんが、最低限、次の3点を把握した上で導入を検討してください。

まず、GPGによって行われた暗号化は、解読するのに必ず秘密鍵が必要になります。秘密鍵を何らかの理由でなくしてしまうと、そのファイルを復号することはほぼ不可能になってしまいます。デフォルトでは ~/.gnupg 以下に保存されているこれらのファイルを確実にバックアップできる必要があります。

2つ目に、秘密鍵はその名の通り、他の人の手に渡らないように注意する必要があります。秘密鍵は、確実なバックアップに加えて、厳重に管理する必要があります。秘密鍵はパスフレーズによって他人には利用できないようにガードされていますが、基本的に他人の手に渡ることは「起きてはいけない」ことです。

3つ目に、公開鍵の適切な運用のためには、公開鍵暗号に関する一定の知識が必要です。今回の知識だけでは、⁠個人的な暗号化」には使えますが、⁠公開鍵認証基盤としてのGPG」は利用しない方が安全です。

以上の注意をふまえた上で、どうしても利用したい方は「gpg --gen-key」でGPGの鍵ペアを作成してください。以下に必要な入力項目を示します。操作を終えると、~/.gnupg/以下に鍵ファイルが作成され、ファイルを右クリックして暗号化することができるようになります。

$ gpg --gen-key
   (1) DSAとElgamal (既定)
   (2) DSA (署名のみ)
   (5) RSA (署名のみ)
選択は?  

→そのまま[Enter]を押します。

DSA keypair will have 1024 bits.
ELG-E keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 

→そのまま[Enter]を押します。

要求された鍵長は2048ビット
鍵の有効期限を指定してください。
         0 = 鍵は無期限
        = 鍵は n 日間で満了
      w = 鍵は n 週間で満了
      m = 鍵は n か月間で満了
      y = 鍵は n 年間で満了
鍵の有効期間は? (0) 

→そのまま[Enter]を押します。

Key does not expire at all
これで正しいですか? (y/N)

→[y][Enter]を押します。

あなたの鍵を同定するためにユーザーIDが必要です。
このソフトは本名、コメント、電子メール・アドレスから
次の書式でユーザーIDを構成します:
    "Heinrich Heine (Der Dichter) "

本名: 

→本名をローマ字表記で入力します。

電子メール・アドレス: 

→メールアドレスを入力します。

コメント: 

→そのまま[Enter]を押します。

(略)

名前(N)、コメント(C)、電子メール(E)の変更、またはOK(O)か終了(Q)? 

→そのまま[o]を押します。

秘密鍵を保護するためにパスフレーズがいります。

→パスフレーズを入力します。他人に類推できないものの、自分では覚えていられるものを設定してください。

おすすめ記事

記事・ニュース一覧