Ubuntu Weekly Recipe

第412回RatticWebでパスワードを管理する

コンピューターを使っていると様々なシーンで必要になるパスワード。安全のためには十分に長く、複雑で、サービスごとにユニークな文字列をひねり出す必要があります。しかし数多くのWebサービスを利用するのが当たり前の現在、何十という複雑怪奇な文字列を暗記するのは難しいですよね。かといって簡単なパスワードや、同じパスワードを使い回したのでは本末転倒というものです。すべてのパスワードを暗記することは諦め、パスワード管理ツールを使うのが現実的な解でしょう。

Ubuntuで使えるパスワード管理ツールにKeePassがあります。KeePassは非常に便利なソフトウェアですが、データをファイルベースで管理するアプリケーションですので「家のデスクトップでも、モバイル用のノートでも、スマホでも使いたい」となった場合、なんらかの方法でパスワードデータベースを同期する必要があります。複数人でデータを共有しようとすると「誰かがパスワードを更新したことを自動的に知る術がない」⁠それゆえ誰かの更新を古いデータで上書きしてしまいがち」という問題も浮上します。そこで今回は、それらの問題を解決できるパスワード管理Webアプリケーション「RatticWeb」を紹介します。

RatticWebのインストール

RatticWebはPython製のソフトウェアです。WebサーバーとしてApache、バックエンドのデータベースとしてMySQL[1]を利用します。Ubuntu向けのパッケージは存在しないため、今回はGitHubで公開されているtarボールからインストールします[2]⁠。なおUbuntuのバージョンは14.04 LTSを使用します[3]⁠。

まずは依存パッケージ一式をインストールします。

$ sudo apt-get install python-dev python-pip python-mysqldb python-ldap libxml2-dev libxslt1-dev zlib1g-dev gettext libmysqlclient-dev

パスワードの初期化等でユーザーにメールを送る必要があるため[4]⁠、Postfixをインストールしておきます。

$ sudo apt-get install postfix

インストール中にPostfixの構成タイプとメールサーバー名を聞かれますので、それぞれ「Internet Site」とサーバーのFQDNを入力してください。

図1 外部にメールを送信するため、Internet Siteを選択する
画像
図2 メールサーバーのFQDNを入力する
画像

通知の送信にしか使用しないため、外部に対して25番ポートを晒さないよう、inet_interfacesにlocalhostを指定します。postconfで設定を行ったら、postfixを再起動します。

$ sudo postconf -e 'inet_interfaces = localhost'
$ sudo service postfix restart

続いてMySQLをインストールします。

$ sudo apt-get install mysql-server

MySQLのrootユーザーのパスワードを聞かれるので、パスワードを設定してください。

図3 MySQLのrootユーザーのパスワードを設定する
画像

MySQLを再起動した後、Rattic用のデータベースとユーザーを作成します。ここではデータベース名、ユーザー名ともに「rattic」としました。

$ mysql -u root -p
mysql> CREATE DATABASE rattic DEFAULT CHARACTER SET utf8;
mysql> GRANT ALL PRIVILEGES ON rattic.* TO 'rattic'@'localhost' IDENTIFIED BY 'ratticユーザーのパスワード' WITH GRANT OPTION;

RatticWeb本体をインストールします。インストール先は/opt/ratticとしました。ディレクトリを掘り、GitHubから現時点での最新リリースである1.3.1のtarボールを取得し、展開します。展開するとRatticWeb-1.3.1というディレクトリが作成されますが、⁠今後予想されるバージョンアップ後も)/opt/rattic/RatticWebというパスでアクセスしたいため、シンボリックリンクを作成しておきます。

$ sudo mkdir -p /opt/rattic/{static,media}
$ wget -O- https://github.com/tildaslash/RatticWeb/archive/v1.3.1.tar.gz | sudo tar zxvf - -C /opt/rattic/
$ sudo ln -s /opt/rattic/RatticWeb-1.3.1/ /opt/rattic/RatticWeb

RatticWebの設定ファイルは/etc/ratticweb.cfgです。以下の内容でファイルを作成してください。secretkeyにはDjangoのシークレットキーを作成して設定します[5]⁠。[database]セクションにはデータベースにアクセスするための設定を記述します。

[ratticweb]
debug = False
secretkey = '(シークレットキー)'
hostname = rattic.example.com
timezone = Asia/Tokyo

[filepaths]
static = /opt/rattic/static
media = /opt/rattic/media

[database]
engine = django.db.backends.mysql
name = (データベース名)
user = (データベースのユーザー名)
password = (データベースのユーザーのパスワード)

パスワードなどの情報が第三者に見られないよう、ファイルのパーミッションを変更しておきます。

$ sudo chown root:www-data /etc/ratticweb.cfg
$ sudo chmod 640 /etc/ratticweb.cfg

pipを使い、必要なPythonパッケージをインストールします。バックエンドにMySQLを使う場合に必要なパッケージ一覧がrequirements-mysql.txtとして用意されていますので、このファイルを読み込ませます。

$ sudo /usr/bin/pip install -r /opt/rattic/RatticWeb/requirements-mysql.txt

この後データベースの初期設定を行うのですが、この原稿を執筆している2016年3月現在、syncdbが動かないという問題があります。そのためワークアラウンドとして以下のコマンドを実行しておきます。

$ sudo rm -rf /usr/local/lib/python2.7/dist-packages/kombu/transport/django/migrations /usr/local/lib/python2.7/dist-packages/djcelery/migrations
$ sudo mv /usr/local/lib/python2.7/dist-packages/kombu/transport/django/south_migrations /usr/local/lib/python2.7/dist-packages/kombu/transport/django/migrations
$ sudo mv /usr/local/lib/python2.7/dist-packages/djcelery/south_migrations /usr/local/lib/python2.7/dist-packages/djcelery/migrations

manage.pyを実行します。

$ cd /opt/rattic/RatticWeb
$ sudo ./manage.py syncdb --noinput
$ sudo ./manage.py migrate --all
$ sudo ./manage.py compilemessages
$ sudo ./manage.py collectstatic -c --noinput
$ sudo ./manage.py demosetup

これでRatticWeb本体のインストールは完了です。最後にWebサーバーとしてApacheと、WSGIモジュールをインストールします。

$ sudo apt-get install apache2 libapache2-mod-wsgi

RatticWebを動かすバーチャルホストを用意します。/etc/apache2/sites-available/rattic.confに以下の内容を記述してください。この際、アクセスに使用する名前(ServerName)と/etc/ratticweb.cfgで設定したhostnameを一致させておいてください。これは、RatticWebはhostnameに指定された名前以外でのアクセスをBad Request(400)で拒否するためです。またLAN内でのみ使用する前提のため、ローカルIPアドレスでアクセス制限をかけています。ネットワークアドレスが異なる場合は適宜書き換えてください。

<VirtualHost *:80>
        ServerAdmin webmaster@example.com
        ServerName rattic.example.com

        Alias /robots.txt /opt/rattic/static/robots.txt
        Alias /favicon.ico /opt/rattic/static/favicon.ico
        AliasMatch ^/([^/]*\.css) /opt/rattic/static/styles/$1
        Alias /media/ /opt/rattic/media/
        Alias /static/ /opt/rattic/static/

        <Directory /opt/rattic/static>
                Require ip 192.168.1.0/24 127.0.0.1
        </Directory>

        <Directory /opt/rattic/media>
                Require ip 192.168.1.0/24 127.0.0.1
        </Directory>

        WSGIScriptAlias / /opt/rattic/RatticWeb/ratticweb/wsgi.py
        WSGIPassAuthorization On

        WSGIDaemonProcess rattic processes=2 threads=25 home=/opt/rattic/RatticWeb/ python-path=/opt/rattic/RatticWeb display-name=%{GROUP}
        WSGIProcessGroup rattic

        <Directory /opt/rattic/RatticWeb/ratticweb>
                <Files wsgi.py>
                        Require ip 192.168.1.0/24 127.0.0.1
                </Files>
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/rattic_error.log

        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/rattic_access.log combined
</VirtualHost>

最後に、バーチャルホストを有効にしてApacheをリロードします。

$ sudo a2ensite rattic
$ sudo service apache2 reload

以上でインストールは完了です。

ユーザーとグループを作成する

ブラウザからRatticWebにアクセスして、管理者でログインしましょう。管理者のIDはadmin、初期パスワードはratticです。なにはともあれadminのパスワードを変更しておきましょう。⁠Profile⁠⁠→⁠Change password」をクリックして、現在のパスワードと新しいパスワードを入力してください。ちなみにProfile画面ではパスワード変更の他に、1ページあたりのパスワード表示件数、お気に入りのタグ[6]⁠、2要素認証の有効化[7]⁠、APIキーの発行、セッションの管理などが行えます。

図4 RatticWebのログイン画面
画像
図5 RatticWebのパスワード一覧画面
画像
図6 ユーザーの情報を編集する
画像

次に、自分用の一般ユーザーアカウントを作成しましょう。ページ上部の「Staff Management」から「Add User」をクリックしてください。ユーザー名、パスワードリセット時にメールを送るメールアドレス、所属するグループ(後述⁠⁠、パスワードを入力します。ここで「Staff status」にチェックを入れると、そのユーザーにユーザーやグループの作成権限を持たせることができます。

図7 ユーザーとグループの編集画面
画像
図8 新しいユーザーを作成する
画像

これからパスワードを登録していくわけですが、RatticWebに登録されるパスワード情報は、必ずひとつのグループに所属している必要あります。そして同じグループに参加しているユーザーだけが、パスワードの閲覧や変更ができるというわけです。初期状態ではグループがひとつも登録されていないため、ユーザーの他にグループも作成しましょう[8]⁠。⁠Staff Management」から「Add Group」をクリックして、グループ名を入力してください。

図9 グループを作成する
画像

グループを作成したら[9]⁠、⁠Staff Management」「Users」一覧からグループに所属させたいユーザーの「Edit」をクリックし、⁠Groups」に作成したグループを足してください。これでこのユーザーがグループに所属し、そのグループが所持しているパスワードデータにアクセスできるようになりました。

図10 グループに所属させる
画像

自分が所属しているグループはページ左の「Groups」以下に一覧表示され、そのグループの所持する全パスワードに素早くアクセスできるようになります。グループで全パスワードを分類し、よく使うパスワードはタグで管理するのが基本です。

図11 お気に入りのタグと所属するグループの一覧。

画像

パスワードを登録する

パスワードを登録するには、⁠Passwords」をクリックしてから「Add New」をクリックします。Create Passwordのページが開いたら、以下の項目を入力してください。各項目には日本語も使用できます[10]⁠。

項目 内容
Title 任意の名前(必須)
Url そのパスワードを利用するURL[11]
Username ユーザーID
Password パスワード
Markdown Description DescriptionをMarkdownで記述できるようにするフラグ
Description パスワードに関する任意のメモ
Owner Group このパスワードが所属するグループ(必須)
Viewers Groups このパスワードを閲覧できるグループ
Tags 任意の検索用タグ
Icon 一覧に表示する際のアイコン
Ssh key SSH秘密鍵
Attachment 任意の添付ファイル

名前とオーナーグループは必須になっています。また見ての通り、パスワードだけでなく、SSHログイン用の秘密鍵なども登録できます。Viewer Groupsは、このパスワード情報を閲覧できるグループの指定です。たとえば開発チームでは、開発サーバーのrootパスワードやクラウドサービスの契約情報など、あらゆるパスワードを管理しているとしましょう。この中にある「テスト中のアプリケーションのログインパスワード」だけはテストチームに共有したいけれど、それ以外の情報は見せたくないのでグループに参加させるわけにはいかない、というようなシチュエーションはよくありますよね。そのような場合、見せたいパスワードのViewer Groupsにテストチームを足すことで、このパスワード情報のみをテストチームのユーザーに見せることができます。

RatticWebのバックアップとリストア

パスワードを集中管理できるのは便利ですが、言いかえれば障害時にすべてのパスワード情報を失う可能性があるということも意味します。言うまでもないことですが、くれぐれもバックアップをしっかり取っておきましょう。RatticWebはすべてのデータがMySQLに保存されているので、データベースをバックアップしておけば、簡単にデータを復元できます[12]⁠。

とはいえデータベースの中身はパスワードというセンシティブな情報ですので、バックアップの取り扱いにも十分注意が必要です。このような理由から、RatticはデータベースのダンプをGPGで暗号化するようになっています。GPGの鍵を持っていない場合は本連載の第28回を参考に、鍵ペアを作成してください[13]⁠。そして以下のコマンドを実行し、暗号化に使う(自分自身の)鍵IDを控えておきます。

$ gpg --list-keys
pub   4096R/(鍵ID)   2016-03-01
uid                  Hajime MIZUNO <mizuno@example.com>

/etc/ratticweb.cfgに以下の記述を追加してください。

[backup]
dir = (バックアップを保存するディレクトリ)
gpg_home = (GPGの鍵輪が保存されているディレクトリ)
recipients = (暗号化に使う鍵ID)

manage.py backupコマンドを実行することでデータベースのバックアップと暗号化が行われ、dirに指定したディレクトリに保存されます。

$ cd /opt/rattic/RatticWeb
$ sudo ./manage.py backup

ディスク故障などの物理的障害を考えると、バックアップはローカルでなくリモートに保存したいですよね。実はRatticWebのバックアップは、ローカルでなくAmazon S3へ保存することもできます。/etc/ratticweb.cfgのbackupセクションに、以下の記述を追加してください。

s3_bucket = (バックアップを保存するバケット名)

バケットへのアクセス権限があるIAMユーザーを作成し、アクセスキーIDとシークレットキーを控えておいてください[14]⁠。これをそれぞれ環境変数AWS_ACCESS_KEY_IDとAWS_SECRET_ACCESS_KEYにセットした上で、manage.pyを実行してください。バックアップファイルがS3へアップロードされます[15]⁠。実運用では環境変数をexportした上でmanage.pyを叩くラッパースクリプトを用意して、cronから実行することになるでしょう。バックアップされたデータの中身は、単なるMySQLのダンプです。なのでデータをリストアしたい場合は、以下のように復号したデータをmysqlコマンドに流し込んでください。

$ mysql -u root -p rattic < <(gpg --decrypt db_backup_1456866001.93.gpg)

RatticWebを使えば、Webベースで簡単にパスワードの共有ができます。kdb形式からのインポート機能もありますので、KeePassに不満があるような場合は、乗り換えを検討してみてはいかがでしょうか?

おすすめ記事

記事・ニュース一覧