プログラマーのメモ書き

伊勢在住のプログラマーが気になることを気ままにメモったブログです

unattended-upgrade の通知設定

[Ubuntu] セキュリティアップデートの自動インストール』 でセキュリティアップデートを自動でインストールするようにしていましたが、こちらの記事『[Ubuntu] unattended-upgrade 実行失敗と復旧』で書いたように、ディスクフルでセキュリティアップデートに失敗することがありました。お恥ずかしい話ですが、ログを見ると一ヶ月ぐらい前に発生していました。

ということで、セキュリティアップデートに関する通知をメールで飛ばすようにしたので、まとめておきます。

 

準備

メールを送れる環境にしておく必要があります。

今回は、『[s3fs] s3fsが予期せずアンマウントされた場合への対策』で行ったのと同じように、ssmtp と mailutils を使った環境をセットアップしました。詳しい設定方法は、リンク先の記事をご覧ください。

 

設定方法

設定方法は、対して難しくなく、/etc/apt/apt.conf.d/50unattended-upgrades 設定ファイルにメールアドレスを記述するだけです。

unattended-upgrades パッケージインストール直後は、Unattended-Upgrade::Mail がコメントアウトされているので、通知をしたいメールアドレスを書き込むだけです。

// Send email to this address for problems or packages upgrades
// If empty or unset then no email is sent, make sure that you
// have a working mail setup on your system. A package that provides
// 'mailx' must be installed.
Unattended-Upgrade::Mail "username@my_domain_name";

とりあえずセキュリティアップデートがかかった場合とエラー時にメールを受け取るようにしました。

エラー時のみでよい場合は、 Unattended-Upgrade::MailOnlyOnError をtrueに設定してください。

 

その他

Unattended-Upgrades にはいろいろと設定ができます。たとえば、

  • 適用するパッケージ種別の選択
  • 除外したいパッケージの指定
  • アップデート時の通知
  • エラー発生時のみ通知
  • パッケージのアップデートの自動再起動(デフォルトでは再起動されません)

などです。詳しくは、こちらの記事『Debian and Ubuntu Automatic Security Updates』などを参考にご自分の環境にあったセットアップを行ってみてください。

 

unattended-upgrade 実行失敗と復旧

[Ubuntu] セキュリティアップデートの自動インストール に書いたように、セキュリティアップデートを自動で適用しています。先日、別の作業で、サーバーにログインしてみると、セキュリティアップデートの適用に失敗していることに気づきました。

今回、これを修復するにあたって行った作業を、自分の作業記録代わりにまとめておきます。なにぶん慣れない作業だったので、あれこれ試したことも書いていますので、ご容赦ください。

 

セキュリティアップデートのログは、 /var/log/unattended-upgrades 以下に保存されているので、ログファイルを調べるとカーネルヘッダのアップデートの際にエラーが起きてました。

2015-08-18 06:48:35,902 INFO 許可されているパッケージ導入元: ['o=Ubuntu,a=precise-security']
2015-08-18 06:50:36,988 INFO Packages that are upgraded: linux-headers-virtual linux-image-virtual linux-libc-dev linux-virtual
2015-08-18 06:50:36,989 INFO dpkg のログを '/var/log/unattended-upgrades/unattended-upgrades-dpkg_2015-08-18_06:50:36.988737.log' に書き込み中
2015-08-18 06:51:06,919 ERROR アップグレードのインストールが失敗しました!
2015-08-18 06:51:06,920 ERROR エラーメッセージ: 'installArchives() failed'

さらに詳細にログを見ると、ディスク容量不足とありました。ちなみに、インストールに失敗したのは、linux-headers-3.2.0-89 および linux-headers-3.2.0-89-virtual パッケージのインストールでした。

なお、現時点で動作しているカーネルのバージョンは、

bitnami@ip-10-132-190-144:~$ uname -r
3.2.0-88-virtual
bitnami@ip-10-132-190-144:~$ 

でした。

 

なにはともあれ、まずは不要なファイルを削除して、再度インストールすればいいかと思い、

bitnami@ip-10-132-190-144:~$ sudo apt-get update
bitnami@ip-10-132-190-144:~$ sudo apt-get -f install
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
依存関係を解決しています ... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
  linux-image-3.2.0-76-virtual
(略)
  linux-headers-3.2.0-65-virtual
これらを削除するには 'apt-get autoremove' を利用してください。
以下の特別パッケージがインストールされます:
  linux-headers-3.2.0-90 linux-headers-3.2.0-90-virtual linux-headers-virtual linux-image-3.2.0-90-virtual linux-image-virtual linux-virtual
提案パッケージ:
  fdutils linux-doc-3.2.0 linux-source-3.2.0 linux-tools
以下のパッケージが新たにインストールされます:
  linux-headers-3.2.0-90 linux-headers-3.2.0-90-virtual linux-image-3.2.0-90-virtual
以下のパッケージはアップグレードされます:
  linux-headers-virtual linux-image-virtual linux-virtual
アップグレード: 3 個、新規インストール: 3 個、削除: 0 個、保留: 177 個。
5 個のパッケージが完全にインストールまたは削除されていません。
25.6 MB のアーカイブを取得する必要があります。
この操作後に追加で 104 MB のディスク容量が消費されます。
続行しますか [Y/n]? y
取得:1 http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu/ precise-updates/main linux-image-3.2.0-90-virtual amd64 3.2.0-90.128 [12.9 MB]
取得:2 http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu/ precise-updates/main linux-virtual amd64 3.2.0.90.104 [1,760 B]
取得:3 http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu/ precise-updates/main linux-image-virtual amd64 3.2.0.90.104 [2,318 B]
取得:4 http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu/ precise-updates/main linux-headers-3.2.0-90 all 3.2.0-90.128 [11.7 MB]
取得:5 http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu/ precise-updates/main linux-headers-3.2.0-90-virtual amd64 3.2.0-90.128 [978 kB]
取得:6 http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu/ precise-updates/main linux-headers-virtual amd64 3.2.0.90.104 [2,286 B]
25.6 MB を 1秒 で取得しました (22.8 MB/s)    
Selecting previously unselected package linux-image-3.2.0-90-virtual.
(データベースを読み込んでいます ... 現在 566980 個のファイルとディレクトリがインストールされています。)
(.../linux-image-3.2.0-90-virtual_3.2.0-90.128_amd64.deb から) linux-image-3.2.0-90-virtual を展開しています...
Done.
Selecting previously unselected package linux-headers-3.2.0-90.
(.../linux-headers-3.2.0-90_3.2.0-90.128_all.deb から) linux-headers-3.2.0-90 を展開しています...
dpkg: /var/cache/apt/archives/linux-headers-3.2.0-90_3.2.0-90.128_all.deb の処理中にエラーが発生しました (--unpack):
 ディレクトリ `./usr/src/linux-headers-3.2.0-90/arch/ia64/include/asm/uv' の作成中にエラーが発生しました: デバイスに空き領域がありません
MaxReports にすでに達しているため、レポートは書き込まれません
                                                             dpkg-deb: error: subprocess ペースト was killed by signal (Broken pipe)
Selecting previously unselected package linux-headers-3.2.0-90-virtual.
(.../linux-headers-3.2.0-90-virtual_3.2.0-90.128_amd64.deb から) linux-headers-3.2.0-90-virtual を展開しています...
dpkg: /var/cache/apt/archives/linux-headers-3.2.0-90-virtual_3.2.0-90.128_amd64.deb の処理中にエラーが発生しました (--unpack):
 (`./usr/src/linux-headers-3.2.0-90-virtual/scripts/recordmcount' の処理中に) `/usr/src/linux-headers-3.2.0-90-virtual/scripts/recordmcount.dpkg-new' の作成に失敗しました: デバイスに空き領域がありません
MaxReports にすでに達しているため、レポートは書き込まれません
                                                             dpkg-deb: error: subprocess ペースト was killed by signal (Broken pipe)
以下のパッケージの処理中にエラーが発生しました:
 /var/cache/apt/archives/linux-headers-3.2.0-90_3.2.0-90.128_all.deb
 /var/cache/apt/archives/linux-headers-3.2.0-90-virtual_3.2.0-90.128_amd64.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)
bitnami@ip-10-132-190-144:~$ 

と実行しても、やはり同じようにディスクに空きがなくてエラーになってしまいます。

dfで確認すると

bitnami@ip-10-132-190-144:~$ df
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/xvda1      10321208 7680236   2116688  79% /
udev              293896       8    293888   1% /dev
tmpfs              60432     168     60264   1% /run
none                5120       0      5120   0% /run/lock
none              302152       0    302152   0% /run/shm
bitnami@ip-10-132-190-144:~$ 

となっており、容量的には約2G近く空いてます。

なんか妙だなとおもって、ひょっとしてiノードが足りなかったりして、まさかねと思って調べてみると

bitnami@ip-10-132-190-144:~$ df -i
Filesystem     Inodes  IUsed IFree IUse% Mounted on
/dev/xvda1     655360 648599  6761   99% /
udev            73474    377 73097    1% /dev
tmpfs           75538    254 75284    1% /run
none            75538      3 75535    1% /run/lock
none            75538      1 75537    1% /run/shm
bitnami@ip-10-132-190-144:~$ 

あぁ・・・。どうもあたりだったようです。話としては、iノードが不足するとファイルを作れなくなると聞いてましたが、まさか本当に起きるなんてびっくりです。

ということで、先に不要なパッケージを削除してみます。

bitnami@ip-10-132-190-144:~$ sudo apt-get autoremove
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
これらを直すためには 'apt-get -f install' を実行する必要があるかもしれません。
以下のパッケージには満たせない依存関係があります:
 linux-headers-virtual : 依存: linux-headers-3.2.0-89-virtual しかし、インストールされていません
E: 未解決の依存関係があります。-f オプションを試してください。
bitnami@ip-10-132-190-144:~$ 

ところが、現時点ではカーネルヘッダのインストールに失敗した状態なので、依存性エラーになってしまってます。

仕方ないので、まずは手作業で不要なカーネルヘッダのパッケージを削除します。古いlinux-headers-3.2.0-xx および linux-headers-3.2.0-xx-virtual あたりをいくつか消します。

bitnami@ip-10-132-190-144:~$ sudo dpkg --purge linux-headers-3.2.0-60-virtual linux-headers-3.2.0-60 
(データベースを読み込んでいます ... 現在 567894 個のファイルとディレクトリがインストールされています。)
linux-headers-3.2.0-60-virtual を削除しています ...
linux-headers-3.2.0-60 を削除しています ...
bitnami@ip-10-132-190-144:~$ sudo dpkg --purge linux-headers-3.2.0-61-virtual linux-headers-3.2.0-61 
(データベースを読み込んでいます ... 現在 545865 個のファイルとディレクトリがインストールされています。)
linux-headers-3.2.0-61-virtual を削除しています ...
linux-headers-3.2.0-61 を削除しています ...
bitnami@ip-10-132-190-144:~$ 

若干ですが、iノードの空きも増えました。

これで、修復をしてみます。

bitnami@ip-10-132-190-144:~$ sudo apt-get -f install
(略)
linux-image-virtual (3.2.0.89.103) を設定しています ...
linux-headers-3.2.0-90 (3.2.0-90.128) を設定しています ...
linux-headers-3.2.0-90-virtual (3.2.0-90.128) を設定しています ...
dpkg: 依存関係の問題により linux-headers-virtual の設定ができません:
 linux-headers-virtual は以下に依存 (depends) します: linux-headers-3.2.0-89-virtual ...しかし:
  パッケージ linux-headers-3.2.0-89-virtual はまだインストールされていません。
dpkg: linux-headers-virtual の処理中にエラーが発生しました (--configure):
 依存関係の問題 - 設定を見送ります
エラーメッセージは前の失敗から続くエラーであることを示しているので、レポートは書き込まれません。
                                                                                                dpkg: 依存関係の問題により linux-virtual の設定ができません:
 linux-virtual は以下に依存 (depends) します: linux-headers-virtual (= 3.2.0.89.103) ...しかし:
  パッケージ linux-headers-virtual はまだ設定されていません。
dpkg: linux-virtual の処理中にエラーが発生しました (--configure):
 依存関係の問題 - 設定を見送ります
エラーメッセージは前の失敗から続くエラーであることを示しているので、レポートは書き込まれません。
                                                                                                linux-libc-dev (3.2.0-89.127) を設定しています ...
以下のパッケージの処理中にエラーが発生しました:
 linux-headers-virtual
 linux-virtual
E: Sub-process /usr/bin/dpkg returned an error code (1)
bitnami@ip-10-132-190-144:~$ 

あれ?やはりエラーになりました。

どうも、最初にセキュリティアップデートでインストールに失敗したバージョンの linux-Headers が正しく設定されていないようです。

なので、それぞれのパッケージをインストールしようとしたのですが、

bitnami@ip-10-132-190-144:~$ sudo apt-get install linux-headers-3.2.0-89-virtual 
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下の問題を解決するために 'apt-get -f install' を実行する必要があるかもしれません:
以下のパッケージには満たせない依存関係があります:
 linux-headers-3.2.0-89-virtual : 依存: linux-headers-3.2.0-89 しかし、インストールされようとしていません
E: 未解決の依存関係です。'apt-get -f install' を実行してみてください (または解法を明示してください)。
bitnami@ip-10-132-190-144:~$ 
bitnami@ip-10-132-190-144:~$ sudo apt-get install linux-headers-3.2.0-89 
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下の問題を解決するために 'apt-get -f install' を実行する必要があるかもしれません:
以下のパッケージには満たせない依存関係があります:
 linux-headers-virtual : 依存: linux-headers-3.2.0-89-virtual しかし、インストールされようとしていません
E: 未解決の依存関係です。'apt-get -f install' を実行してみてください (または解法を明示してください)。
bitnami@ip-10-132-190-144:~$ 

だめでした。

で、途方にくれて、ネットを調べていると、似たようなカーネル関係でトラブッてる話題がありました。

12.04-server update failure after full /boot, apt not working, unmet dependencies to non exiting linux-image kernel

一旦、先に linux-virtual や linux-headers-virtual を削除すればいいようです。

やってみます。

bitnami@ip-10-132-190-144:~$ sudo dpkg --purge linux-headers-virtual 
(データベースを読み込んでいます ... 現在 545884 個のファイルとディレクトリがインストールされています。)
linux-headers-virtual を削除しています ...
bitnami@ip-10-132-190-144:~$ sudo dpkg --purge linux-virtual 
(データベースを読み込んでいます ... 現在 545881 個のファイルとディレクトリがインストールされています。)
linux-virtual を削除しています ...
bitnami@ip-10-132-190-144:~$ 

次に、足りないパッケージをインストールします。

bitnami@ip-10-132-190-144:~$ sudo apt-get install linux-headers-3.2.0-89 
bitnami@ip-10-132-190-144:~$ sudo apt-get install linux-headers-3.2.0-89-virtual 

問題なくインストールできました。

再度インストールします。

bitnami@ip-10-132-190-144:~$ sudo apt-get install linux-headers-virtual 
bitnami@ip-10-132-190-144:~$ sudo apt-get install linux-virtual 

これで、正しくインストールできたはずです。念のため、修復も試しておきます。

bitnami@ip-10-132-190-144:~$ sudo apt-get -f install 
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
  linux-image-3.2.0-76-virtual
(略)
  linux-headers-3.2.0-65-virtual
これらを削除するには 'apt-get autoremove' を利用してください。
アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 177 個。
bitnami@ip-10-132-190-144:~$ 

特に変更作業も発生しないので、問題なさそうです。

一旦ここで、再起動してみます。

bitnami@ip-10-132-190-144:~$ uname -r
3.2.0-90-virtual
bitnami@ip-10-132-190-144:~$ 

無事カーネルもアップデートされたようです。

最後に、今後のために不要なパッケージを削除しておきます。

bitnami@ip-10-132-190-144:~$ sudo apt-get autoremove --purge

めでたしめでたし。

 

ちなみに、autoremove を呼び出す際に、 --purge をつけないと設定ファイルが残ってしまいます。この場合、dpkg --list で見ると、先頭2文字が rc になってます。この状態を解消するには、 dpkg --purge パッケージ名 などを使って削除してください。

dpkg -lの[rc]について

コマンドラインツールの認証をIAMに切り替える

現在、Redmineを運用しているEC2のサーバーですが、ちょっと昔に運用を開始したので、EC2のコマンドラインツール利用時の認証がIAMではなく、いまでいうルートアクセスキーでの認証になっていました。当時はIAMなんてなかったですね。せっかくなので、IAMユーザーを作成して、こちらで認証するように切り替えてみましたので、作業時のメモを残しておきます。

なお、このサーバー上で、ルートアクセスキーを使っている作業は、下記のものになります。

先頭から3つがEC2のコマンドラインツールで、最後の一つがS3(s3cmd)ですので、両方の認証をIAMに切り替えます。

 

(参考) IAMへの移行に関して参考になりそうな記事がいくつかあったので、載せておきます。

 

EC2コマンドラインツールの認証をIAMに切り替え

作業前に、EC2コマンドラインツールの説明を確認すると、X.509証明書を使う方法が見当たりません。環境変数の設定方法も以前とは異なっているようです(以前は、EC2_PRIVATE, EC2_CERT を設定していたのが、AWS_ACCESS_KEY, AWS_SECRET_KEY を設定するようになってます)。少し、ネットを検索してみると、『EC2 API ToolsでアクセスキーIDとシークレットアクセスキーを使う』というブログ記事がありました。こちらを見ると、IAMユーザー用に作成したアクセスキーとシークレットアクセスキーを使えば、問題なく繋がりそうです。

では、実際にやってみます。

IAMユーザーの作成

IAMユーザーを作成します。『管理コンソール』から『IAM』を選択し、『ユーザー』の『新規ユーザーの追加』ボタンを押します。あとは、画面の指示に従って作れば問題ありません。

ユーザー作成後に、アクセスキーとシークレットアクセスキーが表示(およびCSV形式でのダウンロード)されるので、大切に保管しておきます。

作成したユーザーに対して、『ユーザー』→ユーザー名を選択→アクセス許可→『管理ポリシー』→『ポリシーのアタッチ』ボタンを押します。

このユーザーに割り当てる権限の一覧が表示覚ます。今回は、EC2での作業を行いたいので、『AmazonEC2FullAccess』を選択しておきます。

 

同様に、もう一名S3へのアクセス用のユーザーを作成します。ポリシーは、『AmazonS3FullAccess』としておきます。

 

EC2コマンドラインツールの認証情報の切り替え

やってみると、難しい話ではなく、EC2コマンドライン実行時の環境変数として、

# keys
export AWS_ACCESS_KEY=xxxxxxxx
export AWS_SECRET_KEY=xxxxxxxx

を追加するだけです(EC2作業呼び出し用の設定ファイルを書き換えてます)。

 設定後、コマンドラインから、

bitnami@ip-10-132-170-91:~$ ec2ver
1.6.5.2 2012-10-01
bitnami@ip-10-132-170-91:~$ 

 として、正しく認証されていることを確認します。

 

次に、実際にコマンドを呼び出しているところの認証情報の与え方を修正します。以前は、

ec2-create-snapshot --private-key ${EC2_PRIVATE_KEY} --cert ${EC2_CERT} --description "説明" ebs_vol番号

 と与えていたところを

ec2-create-snapshot --aws-access-key ${AWS_ACCESS_KEY} --aws-secret-key ${AWS_SECRET_KEY} --description "説明" ebs_vol番号

 のように修正します。

 

S3(s3cmd)の認証情報の切り替え

こちらの認証情報の切り替えも簡単です。s3cmd の初期設定を呼び出せばOKです。ただし、利用するIAM認証情報は、S3アクセス用のユーザーに対するアクセスキーとシークレットアクセスキーになります。

bitnami@ip-10-132-170-91:~$ s3cmd --configure

Enter new values or accept defaults in brackets with Enter.
Refer to user manual for detailed description of all options.

Access key and Secret key are your identifiers for Amazon S3
Access Key [old_xxxxxxxx]: new_xxxxxxxx
Secret Key [old_yyyyyyyy]: new_yyyyyyyy

Encryption password is used to protect your files from reading
by unauthorized persons while in transfer to S3
Encryption password [xxxxxxxx]: 
Path to GPG program [/usr/bin/gpg]: 

When using secure HTTPS protocol all communication with Amazon S3
servers is protected from 3rd party eavesdropping. This method is
slower than plain HTTP and can't be used if you're behind a proxy
Use HTTPS protocol [Yes]: 

New settings:
  Access Key: new_xxxxxxxx
  Secret Key: new_yyyyyyyy
  Encryption password: xxxxxxxx
  Path to GPG program: /usr/bin/gpg
  Use HTTPS protocol: True
  HTTP Proxy server name: 
  HTTP Proxy server port: 0

Test access with supplied credentials? [Y/n] y
Please wait...
Success. Your access key and secret key worked fine :-)

Now verifying that encryption works...
Success. Encryption and decryption worked fine :-)

Save settings? [y/N] y
Configuration saved to '/home/bitnami/.s3cfg'
bitnami@ip-10-132-170-91:~$ 

 これで、S3へも問題なく接続できるようになりました。

 

ルートアクセスキーの削除

これで、問題なく動作すると思いますので、一通り設定した機能が問題なく動作することを確認しておきます。

問題なかったので、ルートアクセスキーとX.509証明書を削除します。

これで、IAMユーザーへの切り替えが完了しました。

 

余談

まったくの余談になるのですが、SecurityGroupの設定で、自宅のIPアドレスからのアクセスに制限しているのですが、この設定の自動更新を確認するため、自宅のルーターの電源を一旦切って再度いれなおしたところ、DDNSの更新が反映されるのに2時間ぐらいかかってました。こんなにかかるものなんでしたっけ?