nginx で StartSSL のクライアント証明書を使ったクライアント認証をやる

--- 追記 ここから ---

注意

startsslの証明書が主なブラウザから弾かれるようになりました.
詳しくは,この辺とか→StartSSL の証明書が使い物にならなくなっていた件 | ぴんくいろにっき

個人的には,移行をおすすめします.
私は,2017年4月から別の認証局へ移行しております.

--- 追記 ここまで ---

毎回,認証が表示されるのが面倒臭いので,クライアント認証を導入する.

環境

nginxのバージョンを上げるか,opensslのバージョンを上げるかしないとエラーを吐くので,nginxを1.9.12以降に上げるか(#901 (Changes in openssl master wrt SSL_shutdown()) – nginx),opensslを1.1.0以降に上げる(SSL error NginX 1.9.10

本記事では,試験鯖でnginx公式リポジトリ(Debian 8 (Jessie) - Web サーバ Nginx 構築(Nginx 公式リポジトリ使用)! - mk-mode BLOG)を使用して入れた1.10.2-1と,
jessie-backportsを使用して入れた1.0.2k-1により動作確認することとする.

ちなみに,この鯖はそれらとは環境がまた違います.

nginxのアップデート

ownCloudを入れていてnginxを使っている時にnginx-commonを消すとapache2が入ってしまい,/etc/systemd/system/nginx.service/dev/nullを指すようになってしまったので,/lib/systemd/systemにnginx.serviceを書いて(NGINX systemd service file | NGINX),おまじないを唱える.

sudo systemctl unmask nginx.service

そうすると,systemdで制御できるようになるようなので,service nginx startとかが効く.
nginx.serviceに書いてあるバイナリーのバージョンを確認して,問題なければnginxの設定に入る.

nginxの設定

startsslのログインにクライアント証明書を使ったクライアント認証が必要(最近はメールアドレスへのワンタイムパスがサポートされたけど,昔は証明書を失くしたら二度とログインできなかった)なので,当然インストール済だとして,その証明書を使うことにする.
証明書のsubjectは以下とする.

/description=For login authentication only/CN=mail@address.com/emailAddress=mail@address.com

subjectを確認する方法は

openssl pkcs12 -nokeys -info -in CERTIFICATIONFILE.pfx

とかやる.pkcs12の部分は証明書の形式に応じて変更する.

あとはnginxのserverあたりに設定を書く.
基本的な設定は,この辺を流用すると楽チン.Generate Mozilla Security Recommended Web Server Configuration Files

server {
    listen 443 http2;
    server_name YOURDOMAIN;

    ssl on;
    ssl_verify_client on; # クライアント認証を有効化
    ssl_verify_depth 2;   # 認証局を辿る数

    # certs sent to the client in SERVER HELLO are concatenated in ssl_certificate
    ssl_certificate /path/to/crt/of/your/server.crt;
    ssl_certificate_key /path/to/key/of/your/server.key;
    ssl_client_certificate /path/to/crt/of/your/CA.crt;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;


    # modern configuration. tweak to your needs.
    ssl_protocols TLSv1.2;
    ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
    ssl_prefer_server_ciphers on;

    # HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months)
    add_header Strict-Transport-Security max-age=15768000;

    # OCSP Stapling ---
    # fetch OCSP records from URL in ssl_certificate and cache them
    ssl_stapling on;
    ssl_stapling_verify on;

    # Add headers to serve security related headers
    # Before enabling Strict-Transport-Security headers please read into this topic first.
    #add_header Strict-Transport-Security "max-age=15552000; includeSubDomains";
    add_header X-Content-Type-Options nosniff;
    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Robots-Tag none;
    add_header X-Download-Options noopen;
    add_header X-Permitted-Cross-Domain-Policies none;

    # Path to the root of your installation
    root /path/to/your/document/root;
    index index.php index.htm;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    if ($ssl_client_s_dn !~ "/CN=mail@address.com/emailAddress=mail@address.com")
    {
           return 401;
    }

    # あとは普通の設定と同様
}

ね,簡単でしょ?

キー入力イベントの可視化

キー入力のトラブル

PCを使っていると,キー入力が思い通りにいかないことがある.
違うキーが入力されるのは,目で見て分かるのでまだマシな方で,何か入力されているのか否かも分からない場合もある.
その場合,キーイベントを拾って出力させるのが良い.

具体的には,HHKBをHHKモードでWindowsでもLinuxでも使う - hadacchi blogという記事のようなことをしていて,
かつremminaでRDP接続をしている時に,hhk上のALT(◇と入れ替えている)を押しても,スタートメニューが開かない(Winキー入力になってない)場合.

Windows側で確認

KT Software - Keymill がシンプルで良い.
ただし,画面の上側にタスクバーを表示させていると,ウィンドウがタスクバーの後ろに起動して,移動できなくなる.

Linux側で確認

xevコマンドを叩く.
起動したウィンドウを閉じようと思うとマウスを動かすとマウスイベントも拾ってしまうので,コンソールのログが流されてしまうのが欠点.

debian jessie に owncloud 8.1 を導入する

方法

owncloudの入れ方には,大きく分けて2種類

  • apt-getで入れる
    • 普通に入れる
    • backportsから入れる
  • ソースからコンパイル

ついでに,owncloudはwebdavが必要になるので,httpdも入れる.

  • apache2
  • nginx

で,本記事では

  • apt-get で backportsから owncloudを入れる (apache2を使いたくないから)
  • nginx で運用する

手順

  1. nginxと,mysql or mariadbは使える前提
  2. owncloudを入れてみる
    1. sudo apt-get install owncloud
    2. なんか apache2 が入ってきたものの,nginx で十分なので backports で入れることにする
      echo 'deb http://ftp.jp.debian.org/debian/ jessie-backports main contrib non-free' | sudo tee -a /etc/apt/sources.list
      sudo apt-get update; sudo apt-get upgrade
      sudo apt-get -t jessie-backports install owncloud
  3. apache2とかを消す
    1. 普通に消そうとすると,php5-cgiが入ろうとする.これも要らない.php5-cgiも消そうとしたら,php5-fpmが入ろうとする.これは使う.
      sudo apt-get remove apache2 php5-cgi
    2. 他に一緒に入ったものをまとめて消す
      sudo apt-get autoremove
    3. spdyでも良ければ,これでOK
      http2を使う場合は,nginxとopensslもbackportsで入れる
  4. mysqlの設定
    • DB作成.owncloudにログインする時に初期設定するので,何でもOK.ユーザも別で作って良い.
  5. nginxの設定
    • 基本はnginx Example Configurations — ownCloud 9.2 Server Administration Manual 9.2 documentationに従いつつ,Generate Mozilla Security Recommended Web Server Configuration Filesあたりを参照して,自分の環境に直す.
      私の場合,

      -upstream php-handler {
      -    server 127.0.0.1:9000;
      -    #server unix:/var/run/php5-fpm.sock;
      -}
      -
       server {
           listen 80;
      -    server_name cloud.example.com;
           # enforce https
           return 301 https://$server_name$request_uri;
       }
      
       server {
      -    listen 443 ssl;
      -    server_name cloud.example.com;
      +    listen 443 http2;
      +    server_name YOURDOMAINNAME;
      
      -    ssl_certificate /etc/ssl/nginx/cloud.example.com.crt;
      -    ssl_certificate_key /etc/ssl/nginx/cloud.example.com.key;
      +    ssl on;
      +
      +    # certs sent to the client in SERVER HELLO are concatenated in ssl_certificate
      +    ssl_certificate /path/to/certificate/file;
      +    ssl_certificate_key /path/to/certificate/key/file;
      +    ssl_session_timeout 1d;
      +    ssl_session_cache shared:SSL:50m;
      +    ssl_session_tickets off;
      +
      +
      +    # modern configuration. tweak to your needs.
      +    ssl_protocols TLSv1.2;
      +    ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
      +    ssl_prefer_server_ciphers on;
      +
      +    # HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months)
      +    add_header Strict-Transport-Security max-age=15768000;
      +
      +    # OCSP Stapling ---
      +    # fetch OCSP records from URL in ssl_certificate and cache them
      +    ssl_stapling on;
      +    ssl_stapling_verify on;
      
           # Add headers to serve security related headers
           # Before enabling Strict-Transport-Security headers please read into this topic first.
      @@ -83,7 +97,9 @@
               fastcgi_param HTTPS on;
               fastcgi_param modHeadersAvailable true; #Avoid sending the security headers twice
               fastcgi_param front_controller_active true;
      -        fastcgi_pass php-handler;
      +        fastcgi_pass unix:/var/run/php5-fpm.sock;
      +        fastcgi_index index.php;
               fastcgi_intercept_errors on;
               fastcgi_request_buffering off; #Available since nginx 1.7.11
           }
      
  6. あと,この辺も設定しておかないとwebdavで大容量ファイルの転送に失敗すると思われる. nginx + php-fpmでphpを動かす - Qiita
    要するにファイルサイズの上限解除.

DD-WRTをイーサネットコンバータとして使う

client bridge - toshi_hirasawaの日記 を参考にしつつ,
私が使っているものは日本語化されてたり v24-sp2だったりという差分があったので一部補足しながら.

前提

DD-WRT化は済とする.
wl0はAPとして,wl1はClientとして設定する.

構成

+-----+          +----------+                     +--------+                     +-------------+
| HGW +-[Ether]--+ WNDR4300 | < < < [Wi-Fi] < < < | DD-WRT | < < < [Wi-Fi] < < < | smart phone |
+-----+          +----------+                     +----+---+                     +-------------+
                                                       |              +----+
                                                       +---[Ether]----| PC |
                                                                      +----+

DD-WRTの構成

Firmware
DD-WRT v24-sp2 (08/07/10) std

準備

  • 接続環境 (複数経路を用意してバックアップ)
    • 作業用端末からwl0のwifiに接続できるようにする.
    • 作業用端末からDD-WRTの有線LANポートに接続できるようにする.
  • DD-WRTのアドレス固定
    • 基本タブ
      • 基本タブ
        • LAN側接続の項目を自宅内で有効な固定アドレスに設定する.
      • VLAN タブ
        • 全て同一VLANに設定する.

設定

  1. 無線LAN タブ
    1. 基本 タブ
      • wl1のMAC動作モードを「Client Bridge」にする
      • ネットワーク名(SSID)をWNDR4300のSSIDにする
    2. 無線LANセキュリティ タブ
      • wl1の無線LAN認証以下の設定を,WNDR4300とアソシエートできるように設定する
  2. セキュリティ タブ
    1. Firewall タブ
      • Firewall保護のSPI Firewallを「無効」
  3. 基本タブ
    1. 経路 タブ
      • 動作モードを「RIPv2」にする
      • Bird config Styleは「Vtysh」のままでOKだった
      • インターフェースは「LAN&WLAN」のままでOKだった
    2. 基本 タブ
      • スイッチにインターネット側ポートを設定するのチェックボックスを外す
      • この時点(設定ボタンを押した後?)でインターネット接続方法は選択できなくなっており,「無効」になっているはず

こんな感じで,NAT/NAPTなしでイーサネットコンバータとして動作するようになっているはず.
右上のステータスには「WAN: 無効」と出ているはず.

ssh セッションを socks proxy として使う

そもそも,ポートフォワーディングとダイナミックフォワーディングがあるが,後者を使うものとする.

コマンドラインの場合

$ ssh HOST -D LOCAL_PORT

これで,ブラウザのproxyを localhost:LOCAL_PORT とかにすれば良い.

configファイルの場合

Host proxy
    User        USERNAME
    HostName    HOST
    DynamicForward  LOCAL_PORT

これで,ssh proxy とかすれば良い.ブラウザの設定は上と一緒.

clamav で Pdf.Exploit とかで誤検出する場合の対応方法

ClamAV を運用していると,何年も前に入手し通常はアクセスしない PDF ファイルの中から,Pdf.Exploit 系の検出がなされる場合がある.
普通に clamdscan を走らせると発見されると同時に消されてしまうので,たまに困ることがある.

検出しても削除しないようにする

私の環境では,clamdscanだとうまく制御できなかったので,crontab で clamscan を呼ぶことにした.
メールの宛先とかは自分でいじってちょ.
あと freshclam はデーモン化して走らせておくこと.

#!/bin/sh

SCAN=/usr/bin/clamscan
OPT='-ri'
ROOT=/
LOG=/root/clamav.log
MAIL=/usr/bin/mail
FROM=root@HOSTNAME
TO=USERNAME@HOSTNAME

ALART_S="MALWARE was found on $(hostname)!"
ALART_B='see the log file attached.'

MSG_S="last scan log on $(hostname)"
MSG_B="last scan was finished at $(date)"


$SCAN $OPT $ROOT > $LOG

MALWARE=$(tail "$LOG"|grep Infected|cut -d" " -f3)

if [ "$MALWARE" -ne "0" ]; then
    echo "$ALART_B"|$MAIL -a $LOG -s "$ALART_S" -r "$FROM" "$TO"
else
    echo "$MSG_B"|$MAIL -a $LOG -s "$MSG_S" -r "$FROM" "$TO"
fi

特定のシグネチャを無視させる

検出されるシグネチャが増えると誤検出もメールに記載されるため分かりづらくなってくる.
そのシグネチャ自体を無視したい場合は,/var/lib/clamav/hogehoge.ign2とign2ファイルを作ってシグネチャ名をリストしておく.

$ echo Pdf.Exploit.CVE_2016_4207-1 | tee -a /var/lib/clamav/local.ign2

なお,上のシグネチャを無視するかは,貴方の判断で行なうこと.

特定のファイルを無視させる

明らかに問題ないと自分で思っているファイルだけ,あらゆる検出から無視させる場合は,/var/lib/clamav/hogehoge.fpとfpファイルを作ってファイルのシグネチャをリストしておく.

$ sigtool --sha256 /path/to/file | sudo tee -a /var/lib/clamav/local.fp

どっちのがリスクが高いかは使い方次第なので,やっぱし貴方の判断で設定すること.

HHKBをHHKモードでWindowsでもLinuxでも使う

環境

ホストOS
Ubuntu 14.04
ゲストOS
Windows 7
VM PF
Virtualbox

要件

  • Windows側
    • CapsLockを使いたくない
      • HHK モードが理想
        • DIP SW 1: OFF, 2:OFF としたい
    • Windowsキーを使いたい
      • Lite 拡張モードにせざるを得ない
        • DIP SW 1: ON, 2: OFF
    • DeleteよりもBackSpaceを使う
      • DIP SW 3:ON
    • 左手でもFnキーが欲しい
      • DIP SW 4:ON
    • AltキーはSpaceの両隣
      • DIP SW 5:ON
    • Wakeupは無効
      • DIP SW 6:OFF
  • Linux側
    • 右Alt(◇と入れ替えたキー,以降は「新右◇」と表記)をxmonadのショートカットキーの起点にしたい
      • Lite 拡張モードの場合,新右◇はSuper_Rなので,mod4あたりを設定に使えば良かった.HHKモードの場合,新右◇はHenkan_Modeであり,modキーに割り当てられていない.

課題

  • HHKモードでWindowsキーを使いたい
  • HHKモードで新右◇をSuper_Rの代用にしたい

対策

キーマップの変更 in Windows
HKLM\SYSTEM\CurrentControlSet\Control\Keyboard Layout へ Scancode Map を設定する.
他に設定がない場合,

0x00000000
0x00000000
0x02000000
0x5ce07900
0x00000000

とする.
ちなみに,0x79=変換キー,0xe05c=右Windowsキー

xmodmap in Linux
xmodmapを設定した上で,xmodmapでロード.

add Mod4 = Henkcan
xmodmap ~/.Xmodmap

補足

両方設定していても,VM上で正しくWindowsキーとして動作する.

追記(2017/1/24)

remminaで接続した先のWindowsに対して,上の設定ではWindowsキーとしての動作をさせられなかったので別の手段を適用してみた.
この場合,上で行なった設定は不要になるので注意.

この辺を参照のこと.
xkbでキーバインドを変更する – Happy My Life
Ubuntu 15.04: キーボードのカスタマイズ設定 - 児童小銃
要点としては,キーが何になっているのかは xev で確認.
henkan_mode はsetxkbmap上は<HENK>.

キーマップの出力
$ setxkbmap -print > ~/.xkb/keymap/mykbd
キーの置き換え設定の記述
partial modifier_keys
xkb_symbols "HenkSuper" {
    replace key <HENK> {[ Super_L ]};
};
キーマップの修正
~/.xkb/keymap/mykbd の xkb_symbolsの項目のの最後に”+kbd_swap(HenkSuper)”を追加する
キーマップの適用
以下を,X起動時のどこかでやれば良い.

xkbcomp -I${HOME}/.xkb ${HOME}/.xkb/keymap/mykbd $DISPLAY

私の場合,xmonadを使っているので,xmonad.hsのstartupHookで

spawn "xkbcomp -I${HOME}/.xkb ${HOME}/.xkb/keymap/mykbd $DISPLAY; xmodmap ~/.Xmodmap

としてみた.
後ろにxmodmapをつけているのは,xkbcompの実行後にxmodmapがデフォルトに戻ってしまって,xmonadのmodキーの設定が外れてしまうため.

結果

ダメだった.
remminaには,相変わらず何も送信できてないっぽい.
他にremminaの設定でRDPのキーボードレイアウトのタブのuse client keyboard mappingをオン/オフ変えてもダメ.
Super_LとSuper_Rと変えてもダメ.
あんまし意味なかった.

追記(2017/2/24)

rdesktopなら,xkb の方の設定でスタートメニューを開くことができた.
.Xmodmapの方は試してないので不明.

rdesktop -g 2560x1440 -a 32 -z -u $(id -un) -p $(cat /path/to/passwordfile) HOSTADDR

sudo -s した時の insecure directories を消す

home の .zshenv で compinit を呼ぶ時に compinit -u としてチェックを避けているにも関わらず,sudo -s した時にエラーが出るようになってイラついたので,こんなことした.

@@ -1,3 +1,6 @@
+alias   compinit='compinit -u'
+
+
 autoload -U compinit
-compinit -u
+compinit

Guest Windows 7 on Virtualbox in Host Ubuntu machine

前提

ubuntu に virtualbox や bumblebee などは入っていて,GPU を使える環境になっていることとする.

手順

  1. vm をセーフモードで起動して, vboxguestadditions をインストールする.
    インストール時にDicrect3D supportにチェックを入れる.
  2. vm を停止し,vm の settings から display, screen タブへ到達し,Enable 3D Acceleration のチェックを入れる
  3. vm を起動し,dxdiag のディスプレイタブでDirect3Dアクセラレータが使用可能になっていることを確認する

とはいえ,direct3dを使うアプリを実行すると,頻繁に落ちるようになるので,注意すること…