USBGuardの初期デバイスを設定

USBGuardはそのままだとデーモン起動時に接続されていたデバイスは全て許可されるので不正なデバイスが起動時に既に取り付けられていた場合許可されてしまいます. そこで手動で利用可能デバイスをallowで設定に,そしてそれ以外をblockにした.blockでなくrejectの方がセキュリティは上がるけど許可したい場合面倒なのでとりあえずブロックに. これでallow設定されていないデバイスを繋ぐとblock.そのデバイスを利用したい場合は手動でallow-device usbguard-applet-qtでallowにすれば使えます.

※USBGuardは次のページの設定(ユーザ,グループ設定)が済んでいる前提です.

ルールファイルを作成

まずはgenerate-policyで現在の状態をファイルに書き出して編集します. ここでは内蔵カメラもblockにしています.

$ usbguard generate-policy > rules.conf
$ vi rules.conf
$ sudo cat /etc/usbguard/rules.conf
allow id 1d6b:0002 serial "0000:00:1a.0" name "EHCI Host Controller" hash "MwANH+QnAvclGgMNHjzanbOGkp3bPmwqoyAEZZ6QXTQ=" parent-hash "uvJm0y/N2iYeJgfKJsJqWKTJts/duhYZ7W2zzAYk7Y8=" with-interface 09:00:00
allow id 8087:0024 serial "" name "" hash "kv3v2+rnq9QvYI3/HbJ1EV9vdujZ0aVCQ/CGBYIkEB0=" parent-hash "MwANH+QnAvclGgMNHjzanbOGkp3bPmwqoyAEZZ6QXTQ=" via-port "3-1" with-interface 09:00:00
allow id 0a5c:21e6 serial "2016D8DA016E" name "BCM20702A0" hash "C4Os63DCRvIuWJYU/U+1PXrvWlXa2PmpRUQhp+C5eeE=" parent-hash "kv3v2+rnq9QvYI3/HbJ1EV9vdujZ0aVCQ/CGBYIkEB0=" with-interface { ff:01:01 ff:01:01 ff:01:01 ff:01:01 ff:01:01 ff:01:01 ff:01:01 ff:ff:ff fe:01:01 }
allow id 17ef:100a serial "" name "" hash "dMjTmGpj5dFGqH51kQpO/LVBQxE6JkwibVRJQkFCCuU=" parent-hash "kv3v2+rnq9QvYI3/HbJ1EV9vdujZ0aVCQ/CGBYIkEB0=" via-port "3-1.5" with-interface { 09:00:01 09:00:02 }
block id 04f2:b217 serial "" name "Integrated Camera" hash "BxFRAwzjkHO55cQGR8oMRm6bq+Ps2qQtU88jE1Uk5KE=" parent-hash "kv3v2+rnq9QvYI3/HbJ1EV9vdujZ0aVCQ/CGBYIkEB0=" via-port "3-1.6" with-interface { 0e:01:00 0e:02:00 0e:02:00 0e:02:00 0e:02:00 0e:02:00 0e:02:00 0e:02:00 0e:02:00 }
allow id 1d6b:0002 serial "0000:05:00.0" name "xHCI Host Controller" hash "IV7wk04gfQJink/IY4TiGVdcmTzuc09WcSe6k57kWrs=" parent-hash "3TIXKJ1dp4XFV6VxxWU11xbI0yLS0VmRZIaxdsLZDx4=" with-interface 09:00:00
allow id 1d6b:0003 serial "0000:05:00.0" name "xHCI Host Controller" hash "VlZK5oVuQQAlBH76Ekgc+KaZZDL0BAsF9tEf1ynb154=" parent-hash "3TIXKJ1dp4XFV6VxxWU11xbI0yLS0VmRZIaxdsLZDx4=" with-interface 09:00:00
allow id 1d6b:0002 serial "0000:00:1d.0" name "EHCI Host Controller" hash "WwvSEwd+7257rAqUGLMQjffF7zyqygmmLeQTYnR9QzQ=" parent-hash "FjkaT8Rp/Bh++KC4RQhk++hWack2wTDa1a1G5yXqYys=" with-interface 09:00:00
allow id 8087:0024 serial "" name "" hash "Zx7v0FMQEjScKSAFENAiobEs1OGPPB0YWR+yXDCVE04=" parent-hash "WwvSEwd+7257rAqUGLMQjffF7zyqygmmLeQTYnR9QzQ=" via-port "4-1" with-interface 09:00:00
block

ルールファイルを反映して動作確認

設定ファイルをコピーしてデーモンを再起動して反映.

$ sudo install -m 0600 -o root -g root rules.conf /etc/usbguard/rules.conf
$ sudo systemctl restart usbguard

これでallow設定されていないUSBデバイスを接続した状態で起動してもblockに,新しいUSBデバイスを接続してもblockになるようになります.

新しいデバイスを手動で許可する

設定されていないデバイスを利用したい場合は以下のようにlist-devicesでidを確認してallow-device usbguard-applet-qtでallowにして使えるようにします.

$ usbguard list-devices | grep block
15: block id 04f2:b217 serial "" name "Integrated Camera" hash "BxFRAwzjkHO55cQGR8oMRm6bq+Ps2qQtU88jE1Uk5KE=" parent-hash "kv3v2+rnq9QvYI3/HbJ1EV9vdujZ0aVCQ/CGBYIkEB0=" via-port "3-1.6" with-interface { 0e:01:00 0e:02:00 0e:02:00 0e:02:00 0e:02:00 0e:02:00 0e:02:00 0e:02:00 0e:02:00 }
20: block id 1004:631c serial "03a809c94b4befd4" name "LGE Android Phone" hash "0qSmncueL3SVg+z6yyVNMG2l+KxlAsMZWRfpPvCp0oU=" parent-hash "Zx7v0FMQEjScKSAFENAiobEs1OGPPB0YWR+yXDCVE04=" via-port "4-1.1" with-interface ff:ff:00
$ usbguard allow-device 20

20161010_00:10:37-11962

とりあえずこれで良さそうですが,たまにSSDを差し替えることがあります.そうすると前もって設定し直しておかないとデバイスが認識せず不味いことが起こりそうです.ということで設定ファイルにhostnameを付けてそれを使うようにしてみました.

hostごとの設定ファイルを作る

起動時に設定ファイルは指定できますが,ルールファイルは指定できないようです.両方のファイルをホストごとに用意します.

$ sudo cp -p /etc/usbguard/usbguard-daemon.conf /etc/usbguard/usbguard-daemon-`hostname`.conf
$ sudo vi /etc/usbguard/usbguard-daemon-x220.conf
$ diff /etc/usbguard/usbguard-daemon.conf /etc/usbguard/usbguard-daemon-x220.conf
10c10
< RuleFile=/etc/usbguard/rules.conf
---
> RuleFile=/etc/usbguard/rules-x220.conf
$ sudo cp -p /etc/usbguard/rules.conf /etc/usbguard/rules-`hostname`.conf

systemdの起動ファイルを修正してホスト名付きの設定ファイルを使うようにする

Systemdの設定ファイルを用意して設定ファイルをホスト名付きで呼ぶように修正しました.

$ sudo vi /etc/systemd/system/usbguard.service
$ cat /etc/systemd/system/usbguard.service
[Unit]
Description=USBGuard daemon
Wants=systemd-udevd.service local-fs.target
Documentation=man:usbguard-daemon(8)

[Service]
Type=simple
ExecStartPre=/bin/bash -c "/bin/systemctl set-environment hostname=$(/bin/hostname)"
ExecStart=/usr/sbin/usbguard-daemon -k -c /etc/usbguard/usbguard-daemon-${hostname}.conf
Restart=on-failure

[Install]
WantedBy=basic.target

起動し直して確認してみるとホスト名付きのファイルを呼んでいます.

$ sudo systemctl daemon-reload
$ sudo service usbguard restart
$ hostname
x220
$ ps -ef|grep -i usbguard-daemon
root     28545     1  0 00:05 ?        00:00:00 /usr/sbin/usbguard-daemon -k -c /etc/usbguard/usbguard-daemon-x220.conf

ちょっと面倒ですがとりあえずこれで行けそうです.

Let’s Encrypt を使った https 設定

Let’s Encrypt に以前メールアドレスを登録していたのですが,

Let’s Encrypt Closed Beta Invite

とうことでメールが届いていたので試してみました.

ちなみに Let’s Encrypt は DV(Domain Validation)証明書が無料で取得できるサービスで,経路の暗号化はされるけど組織の実在確認まではしないレベルの物.

早速試してみます.
実行環境は Debian jessie amd64 + Apache httpd 2.4(2.4.10-10+deb8u3)

Let’s Encrypt のツールを入手して実行する.

$ git clone https://github.com/letsencrypt/letsencrypt.git
$ cd letsencrypt
$ ./letsencrypt-auto --agree-dev-preview --server https://acme-v01.api.letsencrypt.org/directory auth
Bootstrapping dependencies for Debian-based OSes...
[sudo] password for user:

とすると,必要なパッケージを自動的に導入し始めます.
質問がいくつか来るけど,メールアドレス(Let’s Encrypt 登録時のもの)とコモンネームにApache とそれ以外の選択くらい.これで自動的に Let’s Encrypt のサーバと通信を行い証明書の取得ホト損までしてくれます.
そして,最後にこんな注意書きが表示されました.

IMPORTANT NOTES:
 - If you lose your account credentials, you can recover through
   e-mails sent to user@example.org.
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/example.org/fullchain.pem. Your cert will
   expire on 2016-02-02. To obtain a new version of the certificate in
   the future, simply run Let's Encrypt again.
 - Your account credentials have been saved in your Let's Encrypt
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Let's
   Encrypt so making regular backups of this folder is ideal.

/etc 以下はデイリーでバックアップ取ってるので大丈夫なはず.24時間以上経ったけどメールは未だ届いていないよう.
そして,自動的に /etc/apache2/sites-available/009-example.conf を元に /etc/apache2/sites-available/009-example-le-ssl.conf が作られていました.
※このファイルは letsencrypt-auto を再実行すると消えて実行完了後再生成(以下の修正も必要)されたのでちょっと嫌.多分オプションとかで回避できると思うけど未確認.

以下の2行だけ修正して,

SSLCertificateFile /etc/letsencrypt/live/example.org/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.org/privkey.pem

a2ensite して restart で

$ sudo a2ensite 009-example-le-ssl
$ sudo service apache2 reload

とりあえず動いた

% openssl s_client -connect example.org:443
CONNECTED(00000003)
depth=2 O = Digital Signature Trust Co., CN = DST Root CA X3
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X1
verify return:1
depth=0 CN = example.org
verify return:1
---
Certificate chain
 0 s:/CN=example.org
   i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X1
 1 s:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X1
   i:/O=Digital Signature Trust Co./CN=DST Root CA X3
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIE/TCCA+WgAwIBAgISAbbh6Bp+aXaatBj/TJ7lkyyZMA0GCSqGSIb3DQEBCwUA
MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMTAeFw0xNTExMDQxNjQ4MDBaFw0x
NjAyMDIxNjQ4MDBaMBYxFDASBgNVBAMTC2thZ29sdWcub3JnMIIBIjANBgkqhkiG
9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzb79Wux4LWzC+ZKTRRXN53+/IRraso2AZRrt
/wesf4EBEIl8i6Iu4Dl0FjLoomxZUCN0T7C5iJ4aPy629UkWDZrawFWGkXYT00ed
UziOKTXpYYTM9BBp9Qx1aw/CT8XY6TjOtaJ21AjcIXZBZ8EPnf6fWcHEFCsNYLKk
7U/e59WJ1B1ciXowS7nMwDy1c3rvu7tlzGRuO/xSx/hu0R5DYL8zyPlLwGZyfVv/
UYYtY6Wf8ItzgthpzltqtbMv4Kuohwu2mPwKQJ73MJoOghUD4p6oxiJ3nsgLY8DO
mIlW6ScXihlZ/pWfzjWaohKsvWM+qgnQpWNUQoaXNj0ES34m4QIDAQABo4ICDzCC
AgswDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcD
AjAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBQH4Pb+Brg5Q0PWhEZ7CEdAkxWKxzAf
BgNVHSMEGDAWgBSoSmpjBH3duubRObemRWXv86jsoTBwBggrBgEFBQcBAQRkMGIw
LwYIKwYBBQUHMAGGI2h0dHA6Ly9vY3NwLmludC14MS5sZXRzZW5jcnlwdC5vcmcv
MC8GCCsGAQUFBzAChiNodHRwOi8vY2VydC5pbnQteDEubGV0c2VuY3J5cHQub3Jn
LzAWBgNVHREEDzANggtrYWdvbHVnLm9yZzCCAQAGA1UdIASB+DCB9TAKBgZngQwB
AgEwADCB5gYLKwYBBAGC3xMBAQEwgdYwJgYIKwYBBQUHAgEWGmh0dHA6Ly9jcHMu
bGV0c2VuY3J5cHQub3JnMIGrBggrBgEFBQcCAjCBngyBm1RoaXMgQ2VydGlmaWNh
dGUgbWF5IG9ubHkgYmUgcmVsaWVkIHVwb24gYnkgUmVseWluZyBQYXJ0aWVzIGFu
ZCBvbmx5IGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgQ2VydGlmaWNhdGUgUG9saWN5
IGZvdW5kIGF0IGh0dHBzOi8vbGV0c2VuY3J5cHQub3JnL3JlcG9zaXRvcnkvMA0G
CSqGSIb3DQEBCwUAA4IBAQBa5DjWSE/d6alvGUDNW4guiJauqvxB3B+YULzRTseb
0kXGyu46u16F4av+Ate0Jxq3NnZdOpy8OTiL/wGQeWOWs33zdlxii5o8R12pMMTS
/NWFxawiCkJnzpWkhdLQGv3RNUUQn0w5yXDSY/4wK8nZYJiHXJyNQen2V6vkRPUA
U+u24R4iytsrCXW08bGa+B3F9VIadBa8Br3bbJxV5hxCC2nCE6J8C9jRERc3GKTG
YBuSlM/gaLFopgFjRIDHY5IY5tCB3P8YFbbahqNHCXkh3Ilnlbmn3WW3sOXGOJDT
2s4AbSyzJHdAk3OqtMUoVl/7fk2a70mFiQi0JWotcsoa
-----END CERTIFICATE-----
subject=/CN=example.org
issuer=/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X1
---
No client certificate CA names sent
Peer signing digest: SHA512
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 3171 bytes and written 441 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES128-GCM-SHA256
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES128-GCM-SHA256
    Session-ID: 21463ABE9EDCAF2B93E782CC2C4252E8CAA9A98B6B0036F957218C42A81419CE
    Session-ID-ctx:
    Master-Key: 0B652E199D83894F04BEAB5E268EEA8806F0DAB300AA4F5AA26C3B6361D57766FE5ACF08353DAD07781960A95BDFB7BB
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 300 (seconds)
    TLS session ticket:
    0000 - be 38 de da a3 27 cf 1e-be 39 ee df 1c f0 2e e3   .8...'...9......
    0010 - 47 4e a1 ad 15 8f 43 3c-89 2b 1b 1f ea ef 46 a1   GN....C<.+....F.
    0020 - 09 d3 1b 0d c6 09 9a 99-e1 c2 d7 22 fd e0 b7 6f   ..........."...o
    0030 - 08 cb ba 73 d8 cb 3a 82-55 59 ee 5f 05 56 9c d6   ...s..:.UY._.V..
    0040 - bc 80 1a b3 b0 8c 87 16-2f fc 69 e2 03 0c a2 7f   ......../.i.....
    0050 - 9d e2 1f 2b d3 14 fb b7-78 28 22 48 3b ff 28 52   ...+....x("H;.(R
    0060 - 5e 89 bd cd 9f 3d 4f 26-aa 1d 2d bb af 4a 84 cf   ^....=O&..-..J..
    0070 - ce 3c 20 ac 55 84 33 56-10 6c 19 1a d3 15 ce 30   .< .U.3V.l.....0
    0080 - 7e e7 0b 6f f9 31 ef 92-c0 11 7f 95 de a6 fa 80   ~..o.1..........
    0090 - c1 5d 46 92 d6 b5 0c 5a-78 75 92 ad 1f bb 6f c0   .]F....Zxu....o.
    00a0 - 7f 35 ac 07 41 07 0a c7-a5 f5 5b 3f 16 ca b7 4e   .5..A.....[?...N
    00b0 - d7 7f c1 68 dc 28 e8 15-f9 95 d9 e1 a7 bf d0 c4   ...h.(..........
 
    Start Time: 1446664204
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---
 
% cat cer
-----BEGIN CERTIFICATE-----
MIIE/TCCA+WgAwIBAgISAbbh6Bp+aXaatBj/TJ7lkyyZMA0GCSqGSIb3DQEBCwUA
MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMTAeFw0xNTExMDQxNjQ4MDBaFw0x
NjAyMDIxNjQ4MDBaMBYxFDASBgNVBAMTC2thZ29sdWcub3JnMIIBIjANBgkqhkiG
9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzb79Wux4LWzC+ZKTRRXN53+/IRraso2AZRrt
/wesf4EBEIl8i6Iu4Dl0FjLoomxZUCN0T7C5iJ4aPy629UkWDZrawFWGkXYT00ed
UziOKTXpYYTM9BBp9Qx1aw/CT8XY6TjOtaJ21AjcIXZBZ8EPnf6fWcHEFCsNYLKk
7U/e59WJ1B1ciXowS7nMwDy1c3rvu7tlzGRuO/xSx/hu0R5DYL8zyPlLwGZyfVv/
UYYtY6Wf8ItzgthpzltqtbMv4Kuohwu2mPwKQJ73MJoOghUD4p6oxiJ3nsgLY8DO
mIlW6ScXihlZ/pWfzjWaohKsvWM+qgnQpWNUQoaXNj0ES34m4QIDAQABo4ICDzCC
AgswDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcD
AjAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBQH4Pb+Brg5Q0PWhEZ7CEdAkxWKxzAf
BgNVHSMEGDAWgBSoSmpjBH3duubRObemRWXv86jsoTBwBggrBgEFBQcBAQRkMGIw
LwYIKwYBBQUHMAGGI2h0dHA6Ly9vY3NwLmludC14MS5sZXRzZW5jcnlwdC5vcmcv
MC8GCCsGAQUFBzAChiNodHRwOi8vY2VydC5pbnQteDEubGV0c2VuY3J5cHQub3Jn
LzAWBgNVHREEDzANggtrYWdvbHVnLm9yZzCCAQAGA1UdIASB+DCB9TAKBgZngQwB
AgEwADCB5gYLKwYBBAGC3xMBAQEwgdYwJgYIKwYBBQUHAgEWGmh0dHA6Ly9jcHMu
bGV0c2VuY3J5cHQub3JnMIGrBggrBgEFBQcCAjCBngyBm1RoaXMgQ2VydGlmaWNh
dGUgbWF5IG9ubHkgYmUgcmVsaWVkIHVwb24gYnkgUmVseWluZyBQYXJ0aWVzIGFu
ZCBvbmx5IGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgQ2VydGlmaWNhdGUgUG9saWN5
IGZvdW5kIGF0IGh0dHBzOi8vbGV0c2VuY3J5cHQub3JnL3JlcG9zaXRvcnkvMA0G
CSqGSIb3DQEBCwUAA4IBAQBa5DjWSE/d6alvGUDNW4guiJauqvxB3B+YULzRTseb
0kXGyu46u16F4av+Ate0Jxq3NnZdOpy8OTiL/wGQeWOWs33zdlxii5o8R12pMMTS
/NWFxawiCkJnzpWkhdLQGv3RNUUQn0w5yXDSY/4wK8nZYJiHXJyNQen2V6vkRPUA
U+u24R4iytsrCXW08bGa+B3F9VIadBa8Br3bbJxV5hxCC2nCE6J8C9jRERc3GKTG
YBuSlM/gaLFopgFjRIDHY5IY5tCB3P8YFbbahqNHCXkh3Ilnlbmn3WW3sOXGOJDT
2s4AbSyzJHdAk3OqtMUoVl/7fk2a70mFiQi0JWotcsoa
-----END CERTIFICATE-----
% openssl x509 -in cer -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            01:b6:e1:e8:1a:7e:69:76:9a:b4:18:ff:4c:9e:e5:93:2c:99
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=US, O=Let's Encrypt, CN=Let's Encrypt Authority X1
        Validity
            Not Before: Nov  4 16:48:00 2015 GMT
            Not After : Feb  2 16:48:00 2016 GMT
        Subject: CN=example.org
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:cd:be:fd:5a:ec:78:2d:6c:c2:f9:92:93:45:15:
                    cd:e7:7f:bf:21:1a:da:b2:8d:80:65:1a:ed:ff:07:
                    ac:7f:81:01:10:89:7c:8b:a2:2e:e0:39:74:16:32:
                    e8:a2:6c:59:50:23:74:4f:b0:b9:88:9e:1a:3f:2e:
                    b6:f5:49:16:0d:9a:da:c0:55:86:91:76:13:d3:47:
                    9d:53:38:8e:29:35:e9:61:84:cc:f4:10:69:f5:0c:
                    75:6b:0f:c2:4f:c5:d8:e9:38:ce:b5:a2:76:d4:08:
                    dc:21:76:41:67:c1:0f:9d:fe:9f:59:c1:c4:14:2b:
                    0d:60:b2:a4:ed:4f:de:e7:d5:89:d4:1d:5c:89:7a:
                    30:4b:b9:cc:c0:3c:b5:73:7a:ef:bb:bb:65:cc:64:
                    6e:3b:fc:52:c7:f8:6e:d1:1e:43:60:bf:33:c8:f9:
                    4b:c0:66:72:7d:5b:ff:51:86:2d:63:a5:9f:f0:8b:
                    73:82:d8:69:ce:5b:6a:b5:b3:2f:e0:ab:a8:87:0b:
                    b6:98:fc:0a:40:9e:f7:30:9a:0e:82:15:03:e2:9e:
                    a8:c6:22:77:9e:c8:0b:63:c0:ce:98:89:56:e9:27:
                    17:8a:19:59:fe:95:9f:ce:35:9a:a2:12:ac:bd:63:
                    3e:aa:09:d0:a5:63:54:42:86:97:36:3d:04:4b:7e:
                    26:e1
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Key Usage: critical
                Digital Signature, Key Encipherment
            X509v3 Extended Key Usage:
                TLS Web Server Authentication, TLS Web Client Authentication
            X509v3 Basic Constraints: critical
                CA:FALSE
            X509v3 Subject Key Identifier:
                07:E0:F6:FE:06:B8:39:43:43:D6:84:46:7B:08:47:40:93:15:8A:C7
            X509v3 Authority Key Identifier:
                keyid:A8:4A:6A:63:04:7D:DD:BA:E6:D1:39:B7:A6:45:65:EF:F3:A8:EC:A1
 
            Authority Information Access:
                OCSP - URI:http://ocsp.int-x1.letsencrypt.org/
                CA Issuers - URI:http://cert.int-x1.letsencrypt.org/
 
            X509v3 Subject Alternative Name:
                DNS:example.org
            X509v3 Certificate Policies:
                Policy: 2.23.140.1.2.1
                Policy: 1.3.6.1.4.1.44947.1.1.1
                  CPS: http://cps.letsencrypt.org
                  User Notice:
                    Explicit Text: This Certificate may only be relied upon by Relying Parties and only in accordance with the Certificate Policy found at https://letsencrypt.org/repository/
 
    Signature Algorithm: sha256WithRSAEncryption
         5a:e4:38:d6:48:4f:dd:e9:a9:6f:19:40:cd:5b:88:2e:88:96:
         ae:aa:fc:41:dc:1f:98:50:bc:d1:4e:c7:9b:d2:45:c6:ca:ee:
         3a:bb:5e:85:e1:ab:fe:02:d7:b4:27:1a:b7:36:76:5d:3a:9c:
         bc:39:38:8b:ff:01:90:79:63:96:b3:7d:f3:76:5c:62:8b:9a:
         3c:47:5d:a9:30:c4:d2:fc:d5:85:c5:ac:22:0a:42:67:ce:95:
         a4:85:d2:d0:1a:fd:d1:35:45:10:9f:4c:39:c9:70:d2:63:fe:
         30:2b:c9:d9:60:98:87:5c:9c:8d:41:e9:f6:57:ab:e4:44:f5:
         00:53:eb:b6:e1:1e:22:ca:db:2b:09:75:b4:f1:b1:9a:f8:1d:
         c5:f5:52:1a:74:16:bc:06:bd:db:6c:9c:55:e6:1c:42:0b:69:
         c2:13:a2:7c:0b:d8:d1:11:17:37:18:a4:c6:60:1b:92:94:cf:
         e0:68:b1:68:a6:01:63:44:80:c7:63:92:18:e6:d0:81:dc:ff:
         18:15:b6:da:86:a3:47:09:79:21:dc:89:67:95:b9:a7:dd:65:
         b7:b0:e5:c6:38:90:d3:da:ce:00:6d:2c:b3:24:77:40:93:73:
         aa:b4:c5:28:56:5f:fb:7e:4d:9a:ef:49:85:89:08:b4:25:6a:
         2d:72:ca:1a
-----BEGIN CERTIFICATE-----
MIIE/TCCA+WgAwIBAgISAbbh6Bp+aXaatBj/TJ7lkyyZMA0GCSqGSIb3DQEBCwUA
MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMTAeFw0xNTExMDQxNjQ4MDBaFw0x
NjAyMDIxNjQ4MDBaMBYxFDASBgNVBAMTC2thZ29sdWcub3JnMIIBIjANBgkqhkiG
9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzb79Wux4LWzC+ZKTRRXN53+/IRraso2AZRrt
/wesf4EBEIl8i6Iu4Dl0FjLoomxZUCN0T7C5iJ4aPy629UkWDZrawFWGkXYT00ed
UziOKTXpYYTM9BBp9Qx1aw/CT8XY6TjOtaJ21AjcIXZBZ8EPnf6fWcHEFCsNYLKk
7U/e59WJ1B1ciXowS7nMwDy1c3rvu7tlzGRuO/xSx/hu0R5DYL8zyPlLwGZyfVv/
UYYtY6Wf8ItzgthpzltqtbMv4Kuohwu2mPwKQJ73MJoOghUD4p6oxiJ3nsgLY8DO
mIlW6ScXihlZ/pWfzjWaohKsvWM+qgnQpWNUQoaXNj0ES34m4QIDAQABo4ICDzCC
AgswDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcD
AjAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBQH4Pb+Brg5Q0PWhEZ7CEdAkxWKxzAf
BgNVHSMEGDAWgBSoSmpjBH3duubRObemRWXv86jsoTBwBggrBgEFBQcBAQRkMGIw
LwYIKwYBBQUHMAGGI2h0dHA6Ly9vY3NwLmludC14MS5sZXRzZW5jcnlwdC5vcmcv
MC8GCCsGAQUFBzAChiNodHRwOi8vY2VydC5pbnQteDEubGV0c2VuY3J5cHQub3Jn
LzAWBgNVHREEDzANggtrYWdvbHVnLm9yZzCCAQAGA1UdIASB+DCB9TAKBgZngQwB
AgEwADCB5gYLKwYBBAGC3xMBAQEwgdYwJgYIKwYBBQUHAgEWGmh0dHA6Ly9jcHMu
bGV0c2VuY3J5cHQub3JnMIGrBggrBgEFBQcCAjCBngyBm1RoaXMgQ2VydGlmaWNh
dGUgbWF5IG9ubHkgYmUgcmVsaWVkIHVwb24gYnkgUmVseWluZyBQYXJ0aWVzIGFu
ZCBvbmx5IGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgQ2VydGlmaWNhdGUgUG9saWN5
IGZvdW5kIGF0IGh0dHBzOi8vbGV0c2VuY3J5cHQub3JnL3JlcG9zaXRvcnkvMA0G
CSqGSIb3DQEBCwUAA4IBAQBa5DjWSE/d6alvGUDNW4guiJauqvxB3B+YULzRTseb
0kXGyu46u16F4av+Ate0Jxq3NnZdOpy8OTiL/wGQeWOWs33zdlxii5o8R12pMMTS
/NWFxawiCkJnzpWkhdLQGv3RNUUQn0w5yXDSY/4wK8nZYJiHXJyNQen2V6vkRPUA
U+u24R4iytsrCXW08bGa+B3F9VIadBa8Br3bbJxV5hxCC2nCE6J8C9jRERc3GKTG
YBuSlM/gaLFopgFjRIDHY5IY5tCB3P8YFbbahqNHCXkh3Ilnlbmn3WW3sOXGOJDT
2s4AbSyzJHdAk3OqtMUoVl/7fk2a70mFiQi0JWotcsoa
-----END CERTIFICATE-----

後はコンテンツを全部 https に設定して http から転送するようにしないといけないですね.

とりあえず無料で使える StartSSL,安めの Rapid SSL,キャンペーンや乗り換えで一定期間無料とか色々ありますが,そのくらいのレベルであれば代替になるかなと思います.それ以上は大抵 EV になるでしょうし.ただ CNしか無かったり期間が短いのが気になりますね.

Android の Google Authenticator のデータをダンプしてバックアップする

Android の Google Authenticator 色々な認証に使えて便利ですが,以前 Nexus5 を紛失した時や LGL22 でデータが飛んでしまった後復旧が面倒でした.どうにかバックアップが取れないかなと調べてみました.

Android からデータを取得

/data/data/com.google.android.apps.authenticator2/databases/databases がデータが格納されているファイルらしいです.
adb pull で持ってきたいけど権限がないので一旦 /storage/sdcard0/ に cp する

% adb shell
shell@g2:/ $ su
root@g2:/ # cp /data/data/com.google.android.apps.authenticator2/databases/databases /storage/sdcard0/

ローカルPC に退避

% adb pull /storage/sdcard0/databases .

/storage/sdcard0/ に cp したデータを消す.暗号化領域の下のはずだけど一応上書きしてから削除

% adb shell
shell@g2:/ $ su
root@g2:/ # ls -l /storage/sdcard0/databases
-rw-rw---- root     sdcard_r    16384 2015-10-09 22:51 databases
root@g2:/ # head -c 16384 /dev/random > /storage/sdcard0/databases
root@g2:/ # head -c 16384 /dev/random > /storage/sdcard0/databases
root@g2:/ # head -c 16384 /dev/random > /storage/sdcard0/databases
root@g2:/ # head -c 16384 /dev/random > /storage/sdcard0/databases
root@g2:/ # head -c 16384 /dev/random > /storage/sdcard0/databases
root@g2:/ # head -c 16384 /dev/random > /storage/sdcard0/databases
root@g2:/ # rm /storage/sdcard0/databases
root@g2:/ # ^D
shell@g2:/ $ ^D

データ形式を確認してdump

該当ファイルは file コマンドによると SQLite3 のようなので dump してみる

% file ./databases
./databases: SQLite 3.x database
% sqlite3 ./databases
SQLite version 3.8.11.1 2015-07-29 20:00:57
Enter ".help" for usage hints.
sqlite> .dump
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE android_metadata (locale TEXT);
INSERT INTO "android_metadata" VALUES('ja_JP');
CREATE TABLE accounts (_id INTEGER PRIMARY KEY, email TEXT NOT NULL, secret TEXT NOT NULL, counter INTEGER DEFAULT 0, type INTEGER, provider INTEGER DEFAULT 0, issuer TEXT DEFAULT NULL, original_name TEXT DEFAULT NULL);
 :

ここで取得した PRIMARY KEY を HOTP TOKEN を割り出す script の "google-authenticator.py に食わせると Android App と同じコードが帰ってくるのを確認しました.勿論普通に認証も可能.

IMG_20151010_012917

ということで要root ですが, /data/data/com.google.android.apps.authenticator2/databases/databases を退避して他の端末に持って行っても動作するかも.少なくとも PRIMARY KEY は入手できるので手動で入力すれば OK ですね.
とはいえ端末紛失時には作りなおしたほうが良いでしょうが.

root が取れない場合は登録時に PRIMARY KEY をメモしておくくらいですかね.QR Code だけしか見えない場合は Google Authenticator に食わせる前に別のリーダーを利用したりすれば可能です
例えば以下のような読み取り内容の場合 6QHI5WW6H3FMJ2ZI が PRIMARY KEY です.

otpauth://t│·········· otp/mk@micro?secret=6QHI5WW6H3FMJ2ZI

Facebook PGP対応を試す

logo-gnupg-light-purple-bg

ということでFacebook 自体は殆ど利用していないのですが、PGP GNU 実装のGnuPG の鍵を登録してみました。

先ずは自分の鍵を確認して、

% gpg --fingerprint 572E532C         
pub   4096R/572E532C 2010-03-17
指紋 = 9C3E C527 2FFD AF80 3289  ADE4 398C 09CC 572E 532C
uid                  K.I.Matohara <matoken@gmail.com>
uid                  [jpeg image of size 2077]
uid                  Kenichiro MATOHARA <matohara@gdnewhat-jp.org>
uid                  Kenichiro MATOHARA (KagoshimaLinuxUserGroup.) <matoken@kagolug.org>
sub   2048R/74FBCF68 2015-01-15

公開鍵をASCIIで書き出しして、

% gpg -a --export 572E532C|xclip

facebook に登録します。登録ページは次からアクセス出来ます。
https://www.facebook.com/me/about?section=contact-info

Screenshot from 2015-06-02 11:16:18
Screenshot from 2015-06-02 11:16:38

ここで Use this public key to encrypt notification emails that Facebook sends you? にチェックを付けるとFacebook からの通知も暗号化されるのですが、以下のエラーになってしまいました。(チェックをしない場合はエラーにならない)
利用した鍵の問題だったようです。下記の追記を参照して下さい。

Screenshot from 2015-06-02 11:17:19

PGP public key will be unusable too soon
This PGP Public Key will be unusable for encryption within 30 days. This most likely means that its expiry date is within 30 days, it is already revoked, or the key does not have encryption enabled. Please extend the expiry date or add an encryption subkey to your existing key, or generate a new public key to receive encrypted notifications.

鍵は全部期限内で無期限なんだけどなぜだろう?1024R/2048R/4096Rの鍵をそれぞれ新しく作って試すとこれはいけました。
副鍵が多かったりimage がいけないのかな?公開鍵も大きいし

$ gpg -a --export 572E532C|wc -l #怒られる4096R
208
$ gpg -a --export BD929CA7|wc -l #1024R
13
$ gpg -a --export DB7157B1|wc -l #2048R
30
$ gpg -a --export D9A959F4|wc -l #4096R
52

鍵の登録がうまくいくと以下のような暗号化メールが届きます。これを復号して確認URL にアクセスすると次のメールから暗号化されます。

% head /home/mk/encrypted.asc
-----BEGIN PGP MESSAGE-----
hQIMAxvR4gJcick7AQ/9GA1pbc/bU7p3o3PcxxsTT3HdPeOA5KdD5/GBcxODM1SS
ousJS+9g/IRgykaHcUHcYTJCbW/vyhQnm33Q+HjmOGI6t3n6UfTpxiNFH7WVSNVW
cd5nVSYj/9nlvq1lBk200+NjYdbxSPK40RrLMGwjMHkqRNilK85xFrOW1+B7FRXq
mYdSZkQ2n1XQsqywL+onPGkuM1RA0NARqNX9Iq4PJLrSx04h+8DgCAk8gul7z/iU
l3YnVjDz+I45EMQyzABckFbQQDoFC1T75tV+HDKJetSGQALoYGltA5COZusQdarM
Qmk+ukg+4xWAinV/Vci9jqANdeUDryADKh8nnuJoxVFyz9V4fIJjfp75+D5zPNdQ
uwrTQzBDRQIF9Qttk+5Id8Pi2/vuDzrRFO0ELrh/Zah78Wd3iMUykk2GMeXdnGve
7sq+LT0xkOt1i6vUzYpvlWwxlQ8gdUCXoIIlzEsMD0+TvEhx5xu9/OWt7CCKpYUg
% gpg -d /home/mk/encrypted.asc
次のユーザーの秘密鍵のロックを解除するには
パスフレーズがいります:“Kenichiro MATOHARA (4096R key) <matoken@gmail.com>”
4096ビットRSA鍵, ID 5C89C93B作成日付は2015-06-08 (主鍵ID D9A959F4)
gpg: 4096-ビットRSA鍵, ID 5C89C93B, 日付2015-06-08に暗号化されました
“Kenichiro MATOHARA (4096R key) <matoken@gmail.com>”
Content-Type: multipart/alternative;
boundary="b1_391ab87f1b42dbae36913baf98ac3c0c"
--b1_391ab87f1b42dbae36913baf98ac3c0c
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: 7bit
こんにちは、Kenichiroさん
This is an email to help you enable encrypted notification emails for your Facebook account.
If you prefer to not enable encrypted notification emails from Facebook, you may simply ignore this message.
If you enable encrypted notification emails, Facebook will begin encrypting notification emails to you with your public key. These may include account recovery notification emails.
BEWARE: If at some time in the future you cannot decrypt your account recovery notification emails and if you also become locked out of Facebook, you may be unable to recover your Facebook account.
To proceed with enabling encrypted notification emails, please click this link:
Yes, encrypt notification emails sent to me from Facebook.[https://www.facebook.com/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX]
よろしくお願いいたします。
Facebookチーム

Facebook はなんでこの機能を付けたのかよくわかりませんが,以下の辺りも関係しているのかもですね.

ところで,この機能はクレジットカード会社や銀行なども取り入れて欲しいところです.自分の契約しているところだと法人向けだとやっている所はあるようですが個人向けは無さそうで残念です…….

おまけ?
Key fingerprint = 9C3E C527 2FFD AF80 3289 ADE4 398C 09CC 572E 532C
https://gist.github.com/200fce0896b735ccbc13


追記)
Google+ で+Niibe Yutakaさんにコメントを貰って暗号化用の副鍵が無いのが原因だったようですorz

572E532Cを—edit-keyで見てみると暗号のための副鍵はないので(署名Sと認証Aだけ)、主鍵は署名Sと鍵への署名Cで、この鍵では暗号化メールは送れません。暗号化の副鍵を追加して、ついでにrevokeした副鍵は削除して登録してみるといいんじゃないでしょうか。

% gpg --edit-key 572E532C
gpg (GnuPG) 1.4.18; Copyright (C) 2014 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
秘密鍵が使用できます。
pub  4096R/572E532C  作成: 2010-03-17  満了: 無期限      利用法: SC
信用: 絶対的     有効性: 絶対的
This key was revoked on 2014-02-11 by RSA key 572E532C K.I.Matohara <matoken@gmail.com>
sub  2048R/E0FE9E3E  作成: 2011-02-23  失効: 2014-02-11  利用法: S
sub  2048R/74FBCF68  作成: 2015-01-15  満了: 無期限      利用法: A
[ultimate] (1). K.I.Matohara <matoken@gmail.com>
[ultimate] (2)  [jpeg image of size 2077]
[ultimate] (3)  Kenichiro MATOHARA <matohara@gdnewhat-jp.org>
[ultimate] (4)  Kenichiro MATOHARA (KagoshimaLinuxUserGroup.) <matoken@kagolug.org>
gpg> uid 1
pub  4096R/572E532C  作成: 2010-03-17  満了: 無期限      利用法: SC
信用: 絶対的     有効性: 絶対的
This key was revoked on 2014-02-11 by RSA key 572E532C K.I.Matohara <matoken@gmail.com>
sub  2048R/E0FE9E3E  作成: 2011-02-23  失効: 2014-02-11  利用法: S
sub  2048R/74FBCF68  作成: 2015-01-15  満了: 無期限      利用法: A
[ultimate] (1)* K.I.Matohara <matoken@gmail.com>
[ultimate] (2)  [jpeg image of size 2077]
[ultimate] (3)  Kenichiro MATOHARA <matohara@gdnewhat-jp.org>
[ultimate] (4)  Kenichiro MATOHARA (KagoshimaLinuxUserGroup.) <matoken@kagolug.org>
gpg> key 1
pub  4096R/572E532C  作成: 2010-03-17  満了: 無期限      利用法: SC
信用: 絶対的     有効性: 絶対的
This key was revoked on 2014-02-11 by RSA key 572E532C K.I.Matohara <matoken@gmail.com>
sub* 2048R/E0FE9E3E  作成: 2011-02-23  失効: 2014-02-11  利用法: S
sub  2048R/74FBCF68  作成: 2015-01-15  満了: 無期限      利用法: A
[ultimate] (1)* K.I.Matohara <matoken@gmail.com>
[ultimate] (2)  [jpeg image of size 2077]
[ultimate] (3)  Kenichiro MATOHARA <matohara@gdnewhat-jp.org>
[ultimate] (4)  Kenichiro MATOHARA (KagoshimaLinuxUserGroup.) <matoken@kagolug.org>
gpg> delkey
この鍵を本当に削除しますか? (y/N) y
pub  4096R/572E532C  作成: 2010-03-17  満了: 無期限      利用法: SC
信用: 絶対的     有効性: 絶対的
sub  2048R/74FBCF68  作成: 2015-01-15  満了: 無期限      利用法: A
[ultimate] (1)* K.I.Matohara <matoken@gmail.com>
[ultimate] (2)  [jpeg image of size 2077]
[ultimate] (3)  Kenichiro MATOHARA <matohara@gdnewhat-jp.org>
[ultimate] (4)  Kenichiro MATOHARA (KagoshimaLinuxUserGroup.) <matoken@kagolug.org>
gpg> addkey
鍵は保護されています。
次のユーザーの秘密鍵のロックを解除するには
パスフレーズがいります:“K.I.Matohara <matoken@gmail.com>”
4096ビットRSA鍵, ID 572E532C作成日付は2010-03-17
ご希望の鍵の種類を選択してください:
(3) DSA (署名のみ)
(4) RSA (署名のみ)
(5) Elgamal (暗号化のみ)
(6) RSA (暗号化のみ)
選択は? 6
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 4096
要求された鍵長は4096ビット
鍵の有効期限を指定してください。
0 = 鍵は無期限
<n>  = 鍵は n 日間で満了
<n>w = 鍵は n 週間で満了
<n>m = 鍵は n か月間で満了
<n>y = 鍵は n 年間で満了
鍵の有効期間は? (0)
Key does not expire at all
これで正しいですか? (y/N) y
本当に作成しますか? (y/N) y
今から長い乱数を生成します。キーボードを打つとか、マウスを動かす
とか、ディスクにアクセスするとかの他のことをすると、乱数生成子で
乱雑さの大きないい乱数を生成しやすくなるので、お勧めいたします。
十分な長さの乱数が得られません。OSがもっと乱雑さを収集
できるよう、何かしてください! (あと175バイトいります)
...............+++++
十分な長さの乱数が得られません。OSがもっと乱雑さを収集
できるよう、何かしてください! (あと198バイトいります)
...................+++++
pub  4096R/572E532C  作成: 2010-03-17  満了: 無期限      利用法: SC
信用: 絶対的     有効性: 絶対的
sub  2048R/74FBCF68  作成: 2015-01-15  満了: 無期限      利用法: A
sub  4096R/2D937827  作成: 2015-06-11  満了: 無期限      利用法: E
[ultimate] (1). K.I.Matohara <matoken@gmail.com>
[ultimate] (2)  [jpeg image of size 2077]
[ultimate] (3)  Kenichiro MATOHARA <matohara@gdnewhat-jp.org>
[ultimate] (4)  Kenichiro MATOHARA (KagoshimaLinuxUserGroup.) <matoken@kagolug.org>
gpg> save
% gpg --send-keys 572E532C
gpg: 鍵572E532Cをhkpサーバーkeys.gnupg.netへ送信

この状態で公開鍵をFacebook に登録するとまくいきました。

gnupgの鍵に新しいメールアドレスを登録

たまにしかやらないのでメモ.

鍵ID 572E53 matoken@kagolug.org を登録します.

$ gpg --edit-key 572E53
gpg (GnuPG) 1.4.12; Copyright (C) 2012 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Secret key is available.
pub  4096R/572E532C  created: 2010-03-17  expires: never       usage: SC
trust: ultimate      validity: ultimate
This key was revoked on 2014-02-11 by RSA key 572E532C K.I.Matohara <matoken@gmail.
com>
sub  2048R/E0FE9E3E  created: 2011-02-23  revoked: 2014-02-11  usage: S
[ultimate] (1). K.I.Matohara <matoken@gmail.com>
[ultimate] (2)  [jpeg image of size 2077]  
[ultimate] (3)  Kenichiro MATOHARA <matohara@gdnewhat-jp.org>
gpg> adduid
Real name: KenichiroMATOHARA
Email address: matoken@kagolug.org
Comment:
You selected this USER-ID:
"KenichiroMATOHARA <matoken@kagolug.org>"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
You need a passphrase to unlock the secret key for
user: "K.I.Matohara <matoken@gmail.com>"   
4096-bit RSA key, ID 572E532C, created 2010-03-17
gpg: gpg-agent is not available in this session
gpg: Invalid passphrase; please try again ...
You need a passphrase to unlock the secret key for
user: "K.I.Matohara <matoken@gmail.com>"   
4096-bit RSA key, ID 572E532C, created 2010-03-17
pub  4096R/572E532C  created: 2010-03-17  expires: never       usage: SC
trust: ultimate      validity: ultimate
This key was revoked on 2014-02-11 by RSA key 572E532C K.I.Matohara <matoken@gmail.com>
sub  2048R/E0FE9E3E  created: 2011-02-23  revoked: 2014-02-11  usage: S
[ultimate] (1). K.I.Matohara <matoken@gmail.com>
[ultimate] (2)  [jpeg image of size 2077]  
[ultimate] (3)  Kenichiro MATOHARA <matohara@gdnewhat-jp.org>
[ unknown] (4)  KenichiroMATOHARA <matoken@kagolug.org>
gpg> 4
pub  4096R/572E532C  created: 2010-03-17  expires: never       usage: SC
trust: ultimate      validity: ultimate  
This key was revoked on 2014-02-11 by RSA key 572E532C K.I.Matohara <matoken@gmail.com>
sub  2048R/E0FE9E3E  created: 2011-02-23  revoked: 2014-02-11  usage: S
[ultimate] (1). K.I.Matohara <matoken@gmail.com>
[ultimate] (2)  [jpeg image of size 2077]  
[ultimate] (3)  Kenichiro MATOHARA <matohara@gdnewhat-jp.org>
[ unknown] (4)* KenichiroMATOHARA <matoken@kagolug.org>
gpg> sign
"KenichiroMATOHARA <matoken@kagolug.org>" was already signed by key 572E532C
Nothing to sign with key 572E532C
gpg> list
pub  4096R/572E532C  created: 2010-03-17  expires: never       usage: SC
trust: ultimate      validity: ultimate  
This key was revoked on 2014-02-11 by RSA key 572E532C K.I.Matohara <matoken@gmail.com>
sub  2048R/E0FE9E3E  created: 2011-02-23  revoked: 2014-02-11  usage: S
[ultimate] (1). K.I.Matohara <matoken@gmail.com>
[ultimate] (2)  [jpeg image of size 2077]  
[ultimate] (3)  Kenichiro MATOHARA <matohara@gdnewhat-jp.org>
[ unknown] (4)* KenichiroMATOHARA <matoken@kagolug.org>
gpg> save

確認

$ gpg --list-keys kagolug
gpg: checking the trustdb     
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0  valid:  12  signed:  55  trust: 0-, 0q, 0n, 0m, 0f, 12u
gpg: depth: 1  valid:  55  signed:  52  trust: 55-, 0q, 0n, 0m, 0f, 0u
gpg: next trustdb check due at 2014-07-20
pub   4096R/572E532C 2010-03-17
uid                  K.I.Matohara <matoken@gmail.com>
uid                  [jpeg image of size 2077]
uid                  Kenichiro MATOHARA <matohara@gdnewhat-jp.org>
uid                  KenichiroMATOHARA <matoken@kagolug.org>

間違ってたら教えてください><

自分のPCにキーロガーを設定する

キーロガー.人のPCに仕掛けるのはまずいけど自分の&自分しか使わないPCで試す分には問題ないだろうということで入れてみてます.

入れているのは以下の logkeys

導入方法

DebianやUbuntu だとパッケージがあるので logkeys パッケージを導入するだけ.

% sudo apt-get install logkeys

初期設定

/etc/default/logkeys という設定ファイルを設定します.

ENABLED=1
LOGFILE=/home/mk/.logkeys/`/bin/date +%Y%m%d-%H%M%S-$$`
# This should be updated according to your hardware
# Check README.Debian for more info
DEVICE=/dev/input/event0
  • ENABLED : 0 起動しない / 1 起動する
  • LOGFILE : ログファイルの指定
  • DEVICE : キーボードデバイス指定

自動起動してログファイルの設定,ログするキーボードデバイスの指定をします.
ログファイルは他の人から読まれないようにパーミッションを設定しておきましょう.ファイル名は試しに

/home/mk/.logkeys/`/bin/date +%Y%m%d-%H%M%S-$$`

とか書いてみたら行けました.試してみるもんですね.これで起動毎に新しいログファイルが作成されるはずです.
キーボードデバイスは /proc/bus/input/devices を見たり,実際のデバイスを cat してキー入力してみたりして見つけます.
詳細は /usr/share/doc/logkeys/README.Debian に書かれています.

以下の/proc/bus/input/devices では,頭のがkeyboad のようです.

I: Bus=0011 Vendor=0001 Product=0001 Version=ab54
N: Name="AT Translated Set 2 keyboard"
P: Phys=isa0060/serio0/input0
S: Sysfs=/devices/platform/i8042/serio0/input/input0
U: Uniq=
H: Handlers=sysrq kbd event0 
B: PROP=0
B: EV=120013
B: KEY=402000000 3803078f800d001 feffffdfffefffff fffffffffffffffe
B: MSC=10
B: LED=7
I: Bus=0019 Vendor=0000 Product=0005 Version=0000
N: Name="Lid Switch"
P: Phys=PNP0C0D/button/input0
S: Sysfs=/devices/LNXSYSTM:00/device:00/PNP0C0D:00/input/input3
U: Uniq=
H: Handlers=event2 
B: PROP=0
B: EV=21
B: SW=1
I: Bus=0019 Vendor=0000 Product=0003 Version=0000
N: Name="Sleep Button"
P: Phys=PNP0C0E/button/input0
S: Sysfs=/devices/LNXSYSTM:00/device:00/PNP0C0E:00/input/input4
U: Uniq=
H: Handlers=kbd event3 
B: PROP=0
B: EV=3
B: KEY=4000 0 0
I: Bus=0019 Vendor=0000 Product=0001 Version=0000
N: Name="Power Button"
P: Phys=LNXPWRBN/button/input0
S: Sysfs=/devices/LNXSYSTM:00/LNXPWRBN:00/input/input5
U: Uniq=
H: Handlers=kbd event4 
B: PROP=0
B: EV=3
B: KEY=10000000000000 0
I: Bus=0010 Vendor=001f Product=0001 Version=0100
N: Name="PC Speaker"
P: Phys=isa0061/input0
S: Sysfs=/devices/platform/pcspkr/input/input6
U: Uniq=
H: Handlers=kbd event5 
B: PROP=0
B: EV=40001
B: SND=6
I: Bus=0019 Vendor=17aa Product=5054 Version=4101
N: Name="ThinkPad Extra Buttons"
P: Phys=thinkpad_acpi/input0
S: Sysfs=/devices/platform/thinkpad_acpi/input/input8
U: Uniq=
H: Handlers=kbd rfkill event6 
B: PROP=0
B: EV=33
B: KEY=18040000 0 10000000000000 0 1501b00102004 c000000001104000 e000000000000 0
B: MSC=10
B: SW=a
I: Bus=0003 Vendor=04f2 Product=b217 Version=0854
N: Name="Integrated Camera"
P: Phys=usb-0000:00:1a.0-1.6/button
S: Sysfs=/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.6/1-1.6:1.0/input/input9
U: Uniq=
H: Handlers=kbd event7 
B: PROP=0
B: EV=3
B: KEY=100000 0 0 0
I: Bus=0019 Vendor=0000 Product=0006 Version=0000
N: Name="Video Bus"
P: Phys=LNXVIDEO/video/input0
S: Sysfs=/devices/LNXSYSTM:00/device:00/PNP0A08:00/LNXVIDEO:00/input/input10
U: Uniq=
H: Handlers=kbd event8 
B: PROP=0
B: EV=3
B: KEY=3e000b00000000 0 0 0
I: Bus=0001 Vendor=14f1 Product=506e Version=0001
N: Name="HDA Digital PCBeep"
P: Phys=card0/codec#0/beep0
S: Sysfs=/devices/pci0000:00/0000:00:1b.0/input/input11
U: Uniq=
H: Handlers=kbd event9 
B: PROP=0
B: EV=40001
B: SND=6
I: Bus=0000 Vendor=0000 Product=0000 Version=0000
N: Name="HDA Intel PCH HDMI/DP,pcm=8"
P: Phys=ALSA
S: Sysfs=/devices/pci0000:00/0000:00:1b.0/sound/card0/input18
U: Uniq=
H: Handlers=event10 
B: PROP=0
B: EV=21
B: SW=140
I: Bus=0000 Vendor=0000 Product=0000 Version=0000
N: Name="HDA Intel PCH HDMI/DP,pcm=7"
P: Phys=ALSA
S: Sysfs=/devices/pci0000:00/0000:00:1b.0/sound/card0/input17
U: Uniq=
H: Handlers=event11 
B: PROP=0
B: EV=21
B: SW=140
I: Bus=0000 Vendor=0000 Product=0000 Version=0000
N: Name="HDA Intel PCH HDMI/DP,pcm=3"
P: Phys=ALSA
S: Sysfs=/devices/pci0000:00/0000:00:1b.0/sound/card0/input16
U: Uniq=
H: Handlers=event12 
B: PROP=0
B: EV=21
B: SW=140
I: Bus=0000 Vendor=0000 Product=0000 Version=0000
N: Name="HDA Intel PCH Headphone"
P: Phys=ALSA
S: Sysfs=/devices/pci0000:00/0000:00:1b.0/sound/card0/input15
U: Uniq=
H: Handlers=event13 
B: PROP=0
B: EV=21
B: SW=4
I: Bus=0000 Vendor=0000 Product=0000 Version=0000
N: Name="HDA Intel PCH Dock Headphone"
P: Phys=ALSA
S: Sysfs=/devices/pci0000:00/0000:00:1b.0/sound/card0/input14
U: Uniq=
H: Handlers=event14 
B: PROP=0
B: EV=21
B: SW=4
I: Bus=0000 Vendor=0000 Product=0000 Version=0000
N: Name="HDA Intel PCH Dock Mic"
P: Phys=ALSA
S: Sysfs=/devices/pci0000:00/0000:00:1b.0/sound/card0/input13
U: Uniq=
H: Handlers=event15 
B: PROP=0
B: EV=21
B: SW=10
I: Bus=0000 Vendor=0000 Product=0000 Version=0000
N: Name="HDA Intel PCH Mic"
P: Phys=ALSA
S: Sysfs=/devices/pci0000:00/0000:00:1b.0/sound/card0/input12
U: Uniq=
H: Handlers=event16 
B: PROP=0
B: EV=21
B: SW=10
I: Bus=0011 Vendor=0002 Product=0007 Version=01b1
N: Name="SynPS/2 Synaptics TouchPad"
P: Phys=isa0060/serio1/input0
S: Sysfs=/devices/platform/i8042/serio1/input/input7
U: Uniq=
H: Handlers=mouse0 event17 
B: PROP=5
B: EV=b
B: KEY=e520 10000 0 0 0 0
B: ABS=660800011000003
I: Bus=0003 Vendor=0000 Product=0000 Version=0004
N: Name="ACPI Virtual Keyboard Device"
P: Phys=
S: Sysfs=/devices/virtual/input/input20
U: Uniq=
H: Handlers=sysrq kbd rfkill event18 
B: PROP=0
B: EV=3
B: KEY=ffffffffffffffff ffffffffffffffff ffffffffffffffff fffffffffffffffe
I: Bus=0011 Vendor=0002 Product=000a Version=0000
N: Name="TPPS/2 IBM TrackPoint"
P: Phys=synaptics-pt/serio0/input0
S: Sysfs=/devices/platform/i8042/serio1/serio2/input/input19
U: Uniq=
H: Handlers=mouse1 event19 
B: PROP=0
B: EV=7
B: KEY=70000 0 0 0 0
B: REL=3
I: Bus=0003 Vendor=046d Product=0a29 Version=0111
N: Name="Logicool Logicool Wireless Headset"
P: Phys=usb-0000:00:1d.0-1.1/input3
S: Sysfs=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.1/2-1.1:1.3/0003:046D:0A29.000A/input/input27
U: Uniq=000d44b85a7d
H: Handlers=kbd event1 
B: PROP=0
B: EV=1b
B: KEY=18000 17800000000 8e000000000000 0
B: ABS=ffffff0000000000
B: MSC=10

H: Handlers=sysrq kbd event0 から実際のデバイスは /dev/input/event0 なので,これをcat して何かキーボード入力して反応があるか確認します.当たりのようです.

% sudo cat /dev/input/event0
�w�S��      �w�S��      �w�S��                  �w�S?�w�S?�w�S?p     a�w�SK
�w�SK
�w�SK
�w�w�S��.�w�S��.�w�S��     a�w�S(�^C

実際に使ってみると当たり前ですが入力したものがログファイルに吐かれています.もちろんパスワードなどもそのまま.
日本語入力したものなどはローマ字入力なのでローマ字で記録されています.フィルタにかけると読みやすくなりますね.メタ文字も<lctrl>&ltup><down>のような感じで記録されます.
root で動いているのでユーザを変更しても記録されます.
デバイスを指定しているので,外付けのキーボードを接続すると記録されません.

ちなみにプロセスはこんな感じなので色々丸見えですね.

% ps -ef| grep -i logk
root      1433     1  0  6月10 ?      00:00:25 /usr/bin/logkeys -s -u -d /dev/input/event0 -o /home/mk/.logkeys/20140610-222504-1004

キーロガーへの対策

このlogkeys であれば別のキーボードを使えば回避できます.でも全部のデバイスを記録するソフトウェアキーロガーだと回避できません.OS をLiveCD/USB などで別のものを起動してしまえば回避できます.

ソフトウェアでなく,ハードウェアキーロガーもあります.これはUSB やPS/2 ポートのキーボードの間に取り付けてロギングするものです.OS を変えても回避できません.わかりやすいものはPCの裏を見るだけで何かついてるのですぐわかりますが,キーボードの中やPC 筐体の中に仕込まれると一見しただけではわかりません.
仕込んだロガーを回収してログを回収する必要があるのですが,無線方式のものだと現地に行かなくても無線経由で回収できるので犯人の追跡も難しいです.

ちなみにそんなに特殊なものでなく普通にあちこちで売っています.おまけに安価.

画面を飛ばすものまであります.テンペストを使うよりずっとお手軽で実用的ですね><

ということで,外の端末ではセンシティブな情報は入力しないくらいしか対策は無さそうです.

電波を見て NotePC を検知して盗難

#asiabsdcon を眺めていて見かけたTweet ですが,

これは怖いなー.助手席とか置いてたら一瞬ですね><

最近だとWardriving も特に何も知識なくてもAndroid とかにAPP を入れるだけ(rootもいらない)で出来るのですごくカジュアル&怪しまれずに探れますね.
そういえばゲーム機とかですれ違い通信とかを有効にしてるのも危なさそうだ.

ちょっと違うけどアメリカの免許証のスキミングなんかも車外から可能だそうですが,日本の免許証とかどうなんでしょうねとか色々怖くなって来ました><

AWS のハードウェアMFA を使ってみた

黄色い封筒が郵便受けに.

なんだろうと取り出してみると米Amazon からでした.

IMG_0615IMG_0617

中身は暫く前に注文していたAWS のMFA でした.(ハードウェアトークン生成器)
注文日は8/21,到着は8/29なので8日で届いたようです.

値段は$12.99 + Shipping$4.28 = $17.27 でした.

SMBC のRSA のものに比べると微妙に大きい気がします.
ボタンを押すとトークンが表示されます.RSA のは常時表示.
IMG_0614
IMG_0618

利用してみる

ポータルから「セキュリティ証明書」に飛んで,設定します.
Screenshot_from_2012-08-30 02:36:51

シリアルと,認証コードを2回入力します.このシリアルは背面の大きな文字で書かれているものです.
Screenshot_from_2012-08-30 02:37:16
Screenshot_from_2012-08-30 02:44:28

さて,うまく行ったら認証を試してみましょう.
通常のAWS へのログイン処理の後にもう一回認証画面が現れて,ここに認証コードを入力することでログイン完了になります.
Screenshot_from_2012-08-30 02:45:17

Google の2段階認証と同じですね.
ちなみに,ソフトウェアのMFA ではそのままGoogle Authenticator が使えます.

認証デバイスの紛失対応

さて,これでAWS ログインのセキュリティは高まりました.しかし,このトークン生成器がないとログインができなくなりました.
なくしたり壊したりしたらGoogle の場合は印刷コードなどで復旧できますがAWS MFA の場合はどうすればいいのか確認してみました.

Q: 認証デバイスが紛失、損傷、または盗難され、AWS Portal または AWS Management Console にサインインすることができません。どのようにすればよいですか?
認証デバイスが AWS アカウントに関連付けられている場合は、次の手順に従います:

お問い合わせページから、AWS MFA の無効化を依頼してください。これで、AWS のウェブサイトの保護されたページや AWS マネジメントコンソールに、一時的にユーザー名とパスワードだけでアクセスできるようになります。
アタッカーが認証デバイスを盗み、お客様の現在のパスワードを入手した可能性があるので、Amazon のパスワードを変更してください。
サードパーティのプロバイダ Gemalto から、そのウェブサイトを使って新しいデバイスを購入するか、または IAM コンソールをを使用してアカウントで新しい仮想 MFA デバイスをプロビジョニングします。
上記のステップを完了したら、IAM コンソールを使用して、認証デバイスをアクティベートし、AWS アカウントの AWS MFA を再度有効にします。
認証デバイスが IAM ユーザーに関連付けられている場合は、IAM コンソール、IAM CLI、または IAM API を使用して、IAM ユーザーの MFA デバイスを削除することができます。

Q: 物理的な認証デバイスが働かなくなって、AWS Portal または AWS Management Console にサインインすることができなくなりました。どのようにすればよいですか?
物理的な認証デバイスが AWS アカウントに関連付けられている場合は、次の手順に従います:

当社までご連絡いただき、AWS MFA を無効にしてください。そうすれば、AWS のウェブサイトの保護されたページ、または AWS Management Console に、一時的にユーザー名とパスワードだけを使ってサインインすることができます。
サードパーティのプロバイダ Gemalto に連絡し、認証デバイスに関する援助を受けてください。
別の認証デバイスを一旦入手したら、前のように、AWS のウェブサイトに戻って、認証デバイスをアクティベートし、お客様の AWS アカウントの AWS MFA を再度有効にします。
認証デバイスが IAM ユーザーに関連付けられている場合は、IAM ユーザーのユーザー名とパスワードを提供した人にご連絡ください。

ということで,基本的にはAmazon に無効化を依頼して再設定のようですね.以下が依頼用のフォームぽいです.

Amazon Webサービス

Please tell us about the problem you are experiencing with your MFA device and provide the phone number we can use to reach you. We will call you within 15 minutes of submitting your request for assistance. If your problem does not require telephone assistance, we will contact you via email with instructions for resetting your device.

問題点と電話番号を入力すると15分以内に電話がかかってくるぽいです(でもきっと英語><).若しくはE-Mail(E-Mail の場合も15分以内なんだろうか?)
15分なら許容範囲かなと思います.
#試した方がいらしたら教えてもらえると嬉しいです.

参考URL