Mac OSX High Sierra にすると謎のパージ可能領域が消せない件

重い腰を上げてHigh Sierraにアップデート

Mac OSX のメジャーバージョンアップはいつも少し憂鬱。バージョンアップで動かなくなるソフトが出るのは承知のとおりだが、私の使っている大半のソフトはリリースまでに対応済みのことが多い。

問題は仮想化のVMware Fusionである。OSのバージョンアップのたびにVMwareのバージョンも上がり、毎回安くはないアップデート費用を取られる。それほど頻繁にVMwareを使うわけではないので、バージョンアップには乗り気になれない。そんなわけでVMware FusionからVirtualBoxに乗り換えたのだが、それはまた別の話。

ハードディスクのパージ可能領域

High Sierraにアップデートをした直後からハードディスクがみるみる減っていく。不要ファイルを消したり再起動しても一向に空き領域は増えず、むしろ時間とともに減っていく。いくらなんでもおかしいと思い調べたところ、パージ可能領域というのが圧迫しており、これがTime Machineと関係していることが判明した。このパージ可能領域を簡単に削除する方法が簡単ではなかった。

Time MachineはMacのバックアップソリューションだが、ノートパソコンなどではたまに外付けハードディスクをつけてバックアップすることが多いと思う。そんな運用が多いのはお見通しなのか、High Sierraからは外付けハードディスクがない間は内蔵ディスクにローカルスナップショットを保存取得しておく設定がデフォルトになった。これがパージ可能領域の正体だった。

ローカルスナップショットの確認と削除方法

まずはローカルスナップショットの確認

$ tmutil listlocalsnapshots /
com.apple.TimeMachine.2017-11-18-104524
com.apple.TimeMachine.2017-11-18-123140
com.apple.TimeMachine.2017-11-18-183524

ここでは3つのスナップショットが見つかった。削除方法は以下の通り。

$ tmutil deletelocalsnapshots 2017-11-18-104524
Deleted local snapshot '2017-11-18-104524'

これでパージ領域がなくなったはずだ。

ローカルスナップショットの停止方法

残念ながら、停止方法はわからなかった。Time Machineそのものを止めてしまえば、これ以上スナップショットが増えない。もしくは空き領域が極端に少なくなると自動的に削除されるそうだが、こちらは検証していない。

Raspberry piにmirakurunとchinachuをインストール

ハード

  • raspberry pi
  • PX-S1UD V2.0
  • ACR39-NTTCom(USBカードリーダー)

チューナーの設定

http://plex-net.co.jp/plex/px-s1ud/PX-S1UD_driver_Ver.1.0.1.zipをダウンロードして、ファームウェアをコピーする

$ sudo cp PX-S1UD_driver_Ver.1.0.1/x64/amd64/isdbt_rio.inp /lib/firmware

カードリーダー(B-CASカードの)の設定

$ sudo aptitude install pcscd libpcsclite-dev pcsc-tools

B-CASカードを挿入しておき、pcsc_scanコマンドでカードリーダの状態を確認できる。次にB-CASカードをデコードするarib25ライブラリをインストールする。https://github.com/stz2012/libarib25/archive/09770e3.tar.gzをダウンロードして、/usr/local/srcに置き、make ; make installする。

recdvbのインストール

http://www13.plala.or.jp/sat/recdvb/recdvb-1.3.1.tgzをインストール。以下のコマンドを実行。

$ ./autogen.sh
$ ./configure --enable-b25
$ make
$ sudo make install

以下のコマンドで、録画できることを確認する。

$ recdvb --b25 --strip --sid hd 22 10 test.m2ts

10が録画秒数。22の部分が地デジの物理チャンネル。物理チャンネルはこの辺を参照。http://www.maspro.co.jp/contact/bro/bro_ch.html

MirakurunとChinachuのインストール

ようやくここまでたどり着く。詳しくは公式を見ながら。(https://github.com/Chinachu/Chinachu/wiki/Gamma-Installation-V2)

curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
sudo apt-get install -y nodejs

sudo npm install pm2 -g
sudo pm2 startup

ここまでが準備。続いてMirakurun

sudo npm install mirakurun -g --unsafe --production

updateするときは

sudo npm install mirakurun@latest -g --unsafe --production

まずはコンフィグ

sudo mirakurun config tuners

個階のチューナの設定はデフォルトでは入っていないので、以下を追加。

- name: PX-S1UD-1
  types:
    - GR
  command: recdvb --b25 --strip <channel> - -

インストール後にチャンネルスキャン

curl -X PUT "http://localhost:40772/api/config/channels/scan"

この段階で、MirakurunのAPI越しに放送をストリームできる。VLCなどを使い、http://192.168.0.79:40772/api/channels/GR/28/streamを開くと見られるはず。RaspberryPi上のvlcでlocalhostを指定してみようとしたけど、CPU使用率が300%超えてまともに再生できなかった。

あとは録画インターフェースのChinachuをインストール。録画する予定はないが、とりあえず入れてみた。

git clone git://github.com/kanreisa/Chinachu.git ~/chinachu
cd ~/chinachu/
./chinachu installer
# Auto を選択

RasPi2だとコンパイルに死ぬほど時間がかかった。詳しく見ていないが、4時間位?インストール後に設定をする。

cp config.sample.json config.json
vim config.json

とりあえず、uidのみ設定。http://192.168.0.79:20772を開いて、動作していることを確認。

この時点で、8GBのmicroSDは1.2GBくらいしか空いていないので、録画なんて問題外。外部ストレージをつければ良いのだろうけど、そこまでするかどうかは未定。

 

 

Raspberry pi インストールメモ

ハード

  • Raspberry pi 2 B+
  • micro SD 8GB
  • 無線LANアダプター(WDC-150SU2MBK)
  • Macbook (SDカード書き込み用)

Raspbianの書き込み

https://www.raspberrypi.org/downloads/raspbian/ からRASPBIAN STRETCH WITH DESKTOPをダウンロード。今回のダウンロードは2017-09-07-raspbian-stretch.zipというファイル。念のためにチェックサムを確認。

$ shasum -a 256 tmp/2017-09-07-raspbian-stretch.zip 
a64d742bc525b548f0435581fac5876b50a4e9ba1d1cd6433358b4ab6c7a770b tmp/2017-09-07-raspbian-stretch.zip

SDカードを挿入し以下のコマンドでデバイス名を取得(今回は /dev/disk2)

$ diskutil list
(略)
/dev/disk2 (internal, physical):
 #: TYPE NAME SIZE IDENTIFIER
 0: FDisk_partition_scheme *8.1 GB disk2
 1: Windows_FAT_32 boot 66.1 MB disk2s1
 2: Linux 8.0 GB disk2s

デバイスを確認したらddで書き込むためにアンマウント

$ diskutil unmount /dev/disk2s1

ddコマンドを使いイメージを書き込む

$ sudo dd bs=1m if=tmp/2017-09-07-raspbian-stretch.img of=/dev/disk2 conv=sync

最近のRaspbianはインストール直後はssh接続ができないようになっている。セットアップ時にsshは使いたいので、出来上がったbootフォルダ内に ‘ssh’ というファイルを作っておく。

$ touch boot/ssh

初期設定

ssh接続

sshで接続するのだが、DHCPで取得しているIPアドレスを調べる必要がある。ディスプレイとキーボドが繋がっていれば、ログインしてifconfigで調べればeth0(有線のイーサネットポート)のアドレスが分かるが、ディスプレイ無しで調べるのは以下の方法で。

$ ping 192.168.0.255
$ arp -a

一行目が、自分のネットワークのブロードキャストアドレス。二行目が、自分のPCのarpテーブルを表示する。arpで調べたアドレスの中に、MACアドレスがb8:27:ebで始まっているものがあるはず。これが、raspberry piのベンダーコードなので、これに割り当てているIPアドレスが今回DHCPで取得したアドレスとなる。今回は192.168.0.244だった。

 $ ssh pi@192.168.0.244

初期ユーザはpiでパスワードはraspberry。とりあえずこれでログインするが、初期設定が終わったらこのユーザは停止する。

raspi-configによる初期設定

$ sudo raspi-config

上記のコマンドによる、初期設定。ここで変更したのは、パスワード、ホストネーム、ローカリゼーション、アドバンスドオプションのSDカードの拡張ぐらい。終了すると自動的に再起動。

アップデート

/etc/apt/source.listに近場のリポジトリを登録

deb http://ftp.jaist.ac.jp/raspbian/ stretch main contrib non-free rpi
$ sudo aptitude update
$ sudo aptitude safe-upgrade

ネットワークの状況にもよるが、数分から数十分だと思う。

$ sudo rpi-update

ファームウェアの更新もしておく

$ sudo reboot

再度リブートしておく

ネットワークの設定

普段は無線LANの運用をするので、以下はその設定。Raspberry Pi 2には無線インターフェイスはないので、USBアダプタを接続。あっさりとwlan0として認識した(/sbin/ifconfigで確認)。固定IPアドレスを設定する。場所は/etc/network/interfacesとなる。今回は以下の行を追加。

auto lo
iface lo inet loopback

allow-hotplug eth0
iface eth0 inet dhcp

allow-hotplug wlan0
iface wlan0 inet static
    address 192.168.0.79
    netmask 255.255.255.0
    gateway 192.168.0.1
    dns-domain mirahouse.jp
    dns-nameservers 192.168.0.75
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

無線はwlan0のインターフェース。eth0は有線インターフェースで、無線がつながらない時に使うことになるはずなので、dhcpで残しておく。

無線の最終行はセキュリティの設定となる。wpa_supplicant.confにSSIDやPSKの設定を入れておく。具体的には以下のコマンドで設定。

sudo wpa_passphrase SSID PASSPHRASE | sudo tee -a /etc/wpa_supplicant/wpa_supplicant.conf

問題はパスフレーズ。’!’などの文字が入っているとコマンドが正常に認識されないので、SSIDやパスフレーズなどは’で囲っておく。

ファイルのパーミッションは念のために600にしておくのが良いだろう。(上のコマンドのままだとPSKの平文が残る。念のためにhistoryも消しておくのが良かろう)

ユーザの作成とSSH設定

新たにユーザを作成する。group sudoにも追加して、sudoできるようにしておく。ついでにrootのパスワードも変更しておく。

$ sudo useradd -m -k /etc/skel -d /home/hoge -s /bin/bash hoge
$ sudo passwd hoge
$ sudo gpasswd -a hoge sudo
$ sudo passwd root

すでにある、sshの公開鍵をコピーしてsshのパスワード認証を使えないようにする。

(Raspberry pi)
$ sudo mkdir /home/hoge/.ssh
$ sudo chown hoge.hoge /home/hoge/.ssh
$ sudo chmod 700 .ssh
(クライアント側)
$ scp .ssh/*.pub 192.168.0.79:~/.ssh/
(Raspberry pi ここから新しいユーザでログイン)
$ cd .ssh
$ cat id_edcsa.pub >>authorized_keys
$ cat id_rsa,pub >>authorized_keys

一旦ログアウトして、公開鍵認証でsshできることを確認する。問題ないことを確認したら、/etc/ssh/sshd_configに以下の行を追加。再起動かsshdの再起動を行う。

PasswordAuthentication yes

piユーザからsudoのグループを外しておく

sudo gpasswd -d pi sudo

 

 

 

 

ssh-agentとpkcs11をmacOSXで使う

すごくわかりにくいタイトル

YubikeyにSSHの秘密鍵を入れて、ローカルのハードディスクに鍵は置かないといころまではうまく行った。つぎにあちこちのPCやらサーバから鍵を消しまくりたいのだが、接続した先のサーバから別のサーバに接続なんてケースはママある。ということでssh-agentの登場となるわけですが、ssh-agentにファイルとして存在していない鍵(Yubikeyのようなスマートカード)をどう追加するかという話。

ssh-add -s /usr/local/lib/opensc-pkcs11.so

これで行けることはわかっているんですが、Macだとどうしても動いてくれない。どうやらssh-agentのマニュアルを読むと-Pオプションで、信頼できるpkcsライブラリで指定するらしい。これがデフォルトだと/usr/lib*/*と、/usr/local/lib*/*になっているようで、上のopensc-pkcs11.soも問題ないじゃないかと思っていのだが、MacOSXの場合はHomebrewでopenscをインストールしており、上記のパッケージもシンボリックリンクでおいてあった。

-Pオプションにオリジナルの場所を追加しようとしたのだが、どうもうまく行かず、非常に安直なworkaroundだが、オリジナルをコピーして/usr/local/libにおいたらうまく動いた。

アップデートしたら動かなくなるかもしれないし、脆弱性があっても放置される可能性があるので、おすすめはできない。-Pオプションで解決したい。

Yubikey (スマートカード)に入れた秘密鍵を使ってSSHにログインする

ラノベのタイトルみたいになってしまった

すったもんだしてYubikeyにSSHの秘密鍵を入れるところまで行ったのだが、これを利用して、ローカルのハードディスクに秘密鍵を置かずに、SSHのログインを使用という話。クライアントはWindows,Mac,Linuxを想定している。
いままで、公開鍵暗号でのSSH接続ができていたことが前提。

Mac,Linux

Yubicoのページ( https://developers.yubico.com/PIV/Guides/SSH_with_PIV_and_PKCS11.html )のStep 4 からほぼそのままでいけた。

まずはOpenSCのインストール。Mac OSX の場合はhomebrewでインストールするのがよさ気。

brew install opensc

これだけでいける。インストール先は/usr/local/opt/openscになる。環境によっては、/usr/local/Cellar/openscになることもある。インストールされたディレクトリは以下のコマンドでも確認できる。

brew --prefix opensc

OSXはメジャーバージョンアップの際に/usr/localにものがあるとしくじる前科があるので若干心配だ。Linuxの場合は、それぞれのパッケージ管理ソフトに従う。

次に参考したページにはssh-keygenで公開鍵を取り出して、リモートホストのauthorized_keysに追加せよとあるが、今まで同じ鍵でサーバ運用していた場合は関係なし。

必要なのはpkcs11のライブラリの場所を調べてそいつがスマートカードを読み取れるかどうか。ちなみに手近のLinuxクライアントはVMware Player のDebianしかないのだが、VMのゲストOSがスマートカードを認識できないので確認できない。(no slotsというエラーが出る)

あとはsshコマンドを叩くときにIオプションでpkcs11ライブラリの場所を指定するだけ。

ssh -I /usr/local/opt/opensc/lib/opensc-pkcs11.so remotehost

こうするとYubikeyの中の秘密鍵を使ってセッションを確立します。しかしこれを毎回打つのは面倒なので、~/.ssh/configに記述しておきます。私の場合はこんな感じ。

Host hoge
        Hostname          hoge.example.jp
        Port              12345
        PKCS11Provider    /usr/local/opt/opensc/lib/opensc-pkcs11.so

 

4行目に書いてあるPKCS11Providerが追加されたところ。

Windows

WindowsのSSHクライアントといえば、TeratermかPuttyが思い浮かぶ。そんな人に手っ取り早いのが、Puttyの中に入っているPageantを使う方法。認証エージェントですが、スマートカード対応版があります。Puttyシリーズをスマートカード対応にしているPutty-CACというプロジェクトがあってバイナリを公開しています。

SSHサーバに接続するだけなら、Putty本体とTeratermでも使えるPageantをダウンロードするだけで大丈夫です。

Puttyそのものの使い方は割愛しますが、接続先ホストの設定でConnection-SSH-Certificationとすすみ、Attempt Certification Authentication にチェックを入れて、Set CAPI certで証明書を選び、PIN入力が出てくれば接続可能です。

同じようにpageantにも証明書を指定しておき、Teratermで接続する際にSSH認証で、pageantを使う、でPIN入力が出てくれば接続可能です。

pageantはOS起動時に起動させれば良いと思います。

その他

それにしてもECDSAの鍵を使えないのが痛い。。。

Yubikey 4 にSSHの秘密鍵を格納する

 

Yubico社のYubikey4は単なるワンタイムパスワード生成器じゃなくて証明書を格納可能になった。SSHの秘密鍵をYubkikeyに入れて、sshでログインするときだけYubikeyをPCに挿せば、秘密鍵をあちこちのPCに保存しておく必要がなくなり安心である。Yubikey4は日本のAmazonでも販売されている(AA)

Yubikey自体に鍵生成機能があるので、そこで秘密鍵と公会議のペアを作っても良いのだが、あちこちのサーバの公開鍵を置き換えるのが面倒なのと、Yubikey内で生成した秘密鍵はセキュリティ上取り出すことができないので、既存の鍵を使いたい。当然鍵は取り出せないのが安全なのだが、万が一Yubikeyごと秘密鍵をなくしてしまったら二度とその鍵でログインできなくなるのが怖いのだ。ちなみに、既存の秘密鍵をYubkikeyに入れたものも取り出せないので、一通り設定が終わったら、あちこちのPCにある秘密鍵を消し去って、信頼できるところにだけ秘密鍵のコピーを持っておくつもり。なんなら秘密鍵を紙に印刷しておくのが一番安全かもしれない。

以上の理由で、既存の秘密鍵をYubikeyに入れるのだが、やり方が簡単ではなかったのでメモっておく。前提として、rsa 2048bitの秘密鍵 id_rsa を格納するとする。

 

鍵の変換

まずは既存の鍵の変換から。sshの鍵生成は普通ssh-keygenで行うと思うのだが、これで作られる秘密鍵と公開鍵はopensshの独自仕様のようなので、まずはPEM形式に変換する。PEMとかDERとかいうのは鍵のエンコーディング形式でPEMは鍵をBASE64でエンコーディングしてあり、DERはバイナリのようだ。opensshはBASE64なのだが、PEMとヘッダーとかが違うそうだ。

opensll rsa -in id_rsa -out ide_rsa.pem -outform pem

これでPEM形式に変換。

次に同じように公開鍵も作る

openssl rsa -in id_rsa.pem -pubout >id_rsa_pub.pem

 

Yubikey4のPINコード等の変更

次にyubico社からダウンロードしたyubico-piv-toolを使う。ただしサンプルのとおりにコマンドを打ってもエラーが出る(Windows)ので多少工夫が必要。まずは、yukbikeyをUSBに差し込んで、まずはPINコード、PUKコード(管理者用)、マネジメントキーを変更する。

まずマネジメントキーを登録する。

yubico-piv-tool -a set-mgm-key -n (16進数48文字)

すでにマネジメントキーが登録されている場合は、-kオプションのあとに既存のキーを書く。不思議なのは、-kオプションの後にスペースをおいてキーを指定してもうまく動かない。オプションの後のスペースはあってもなくてもいいのだが、kオプションだけはなぜかスペースがあるとうまく動かない。

yubico-piv-tool -a set-mgm-key -n (16進数48文字) -k(古いマネジメントキー)

次にPIN

yubico-piv-tool -a change-pin

デフォルトのPINは123456で、同じくデフォルトのPUKは12345678。

yubico-piv-tool -a change-puk

同じく変更する。

この辺のキーの変更はGUIツールのほうが使いやすい。(ただしGUIツールはなぜかPUKコードが変更できない。なんだか中途半端……)

あと、好みではあるが、リトライ回数を設定する。

yubico-piv-tool -a verify -P(PIN) -a pin-retries --pin-retries=15 --puk-retries=15 -k(mgm key)

秘密鍵の格納

PEM形式に変換した秘密鍵をyubikeyに格納する。yubico-piv-toolのマニュアル( https://www.yubico.com/wp-content/uploads/2016/05/Yubico_PIV_Tool_Command_Line_Guide_en.pdf )によるとyubikeyの証明書を保存する領域は9a,9c,9d,9eと4つあるようで、9aがPIV Authentication、9cがDigital Signature、9dがKey Management、9eが- Card Authenticationらしい。今回は9aに格納する。

yubico-piv-tool -a import-key -s 9a -i id_rsa.pem -K PEM -k(マネジメントキー)

公開鍵の自己署名証明書作成と格納

次に公開鍵を自己署名する。自分で作った秘密鍵の正当性をどのように担保するかについて、第三者にお墨付きをつけてもらう方法もあるが、今回の目的は他人に自分の秘密鍵の正当性を主張したいわけではないので、自分の秘密鍵の正当性は自分で担保する。これをwebでやるといわゆるオレオレ証明書になるやつだ。今回、yubkikeyはOSから見るとスマートカードとして見えるので、SSHの秘密鍵の対になる公開鍵を自己署名して、自己署名証明書を作り鍵ペアをyubikey内部においておく。まずは公開鍵の自己署名証明書から。

この操作は指定されたスロットに秘密鍵が入っていることが前提。秘密鍵を入れずにやってもエラーになる。

yubico-piv-tool -a verify-pin -a selfsign-certificate -s 9a -S "/CN=SSH/" -i id_rsa_pub.pem -o 9a-cert.pem --valid-days=(日数)

この操作にはPINコードが必要になる。Sオプションはx.509証明書の記述だ。最低限CN(Common Name)さえ入っておけば大丈夫だと思う。OSの証明書選択画面などで使われる名前だ。–valid-daysは証明書の有効期限で、指定しないとでおフォルトで365日となる。試しに1日で作ったのだが、2日経っても期限切れの証明書が使えた。本当に意味あるのか不安。

次に、この証明書をyubikeyに格納する。

yubico-piv-tool -a import-certificate -s 9a -i 9a-cert.pem -K PEM -k(マネジメントキー)

以上でyubikeyに対する操作は終了

yubico-piv-tool -a status

で証明書の状態を確認できる。

CHUIDの作成

普通は必要ないと思うが、実験などでハードウェアリセットをかけてしまうとCHUIDがなくなってしまう。ランダムでCHUIDを発行する必要がある。

yubico-piv-tool -a set-chuid -s 9a

その他

同じ手順で、ECDSA384bit鍵の登録を試みた。同じ鍵を複数鍵を登録することは不可能なので、スロット82に格納してみたいが、Windowsからだと証明書の一覧にECDSAの鍵が出てこない。スロット82だとダメなのかと思って、9aに入れてみたが、やっぱり出てこない。

iptables,ip6tablesの設定

これもすぐに設定の仕方を忘れるので覚書。

まずは、iptables-persistentをインストールしておく。設定ファイルは、/etc/iptables/rules.v4と/etc/iptables/rules.v6。もちろん環境に合わせて書き換える。私の場合はipv4が

# Generated by iptables-save v1.4.21 on Fri Feb 12 17:18:19 2016
*nat
:PREROUTING ACCEPT [2:104]
:INPUT ACCEPT [1:64]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A DOCKER -i docker0 -j RETURN
COMMIT
# Completed on Fri Feb 12 17:18:19 2016
# Generated by iptables-save v1.4.21 on Fri Feb 12 17:18:19 2016
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [3:349]
-A INPUT -p icmp -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p udp -m state --state ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport hogehoge -j ACCEPT
-A INPUT -p tcp -m tcp --dport hogehoge -j ACCEPT
-A INPUT -p udp --dport 500 -j ACCEPT
-A INPUT -p udp --dport 4500 -j ACCEPT
-A INPUT -i lo -j ACCEPT
COMMIT
# Completed on Fri Feb 12 17:18:19 2016

ipv6が

# Generated by ip6tables-save v1.4.21 on Fri Feb 12 17:18:19 2016
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -p ipv6-icmp -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p udp -m state --state ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport hogehoge -j ACCEPT
-A INPUT -p tcp -m tcp --dport hogehoge -j ACCEPT
COMMIT
# Completed on Fri Feb 12 17:18:19 2016

こんな感じ。

あとは、以下のコマンドです。

netfilter-persistent reload

munin-node-configure でsquid追加

すぐに忘れてしまうので覚書

muninで監視項目を新しく追加するときnode-munin-configureコマンドを使う

munin-node-configure

オプション無しで使うと現在の状態が表示される

munin-node-configure --suggest

suggestオプションを使うと追加できるかどうかとその理由がわかる。今回、squidを追加しようとしたのだが、「[could not connect: Connection refused]」と言われてしまったので原因を探ると、squidのポート番号を変えていることが原因。なので、/etc/muinn/plugin-conf.d/munin-nodeに以下の行を追加。

[squid_*]
env.squidport ポート番号

これで、追加できるようになるので以下のコマンドで、プラグインのリンクができるようになっているのを確認して

#munin-node-configure --shell squid_
ln -s '/usr/share/munin/plugins/squid_cache' '/etc/munin/plugins/squid_cache'
ln -s '/usr/share/munin/plugins/squid_objectsize' '/etc/munin/plugins/squid_objectsize'
ln -s '/usr/share/munin/plugins/squid_requests' '/etc/munin/plugins/squid_requests'
ln -s '/usr/share/munin/plugins/squid_traffic' '/etc/munin/plugins/squid_traffic'
#その他のエラーが表示されるかも

問題ないようなら、以下のようにシェルに渡してあげて登録。

munin-node-configure --shell squid_ | sh

サービスを再起動して終了

service munin-node restart

sslhによるtcp/443でのsshd,httpdの両まちうけ

最近はネットワークのフィルタリングが厳密すぎて、tcp/22ポートにおけるsshの接続ができなくなってきました。sshはsshd_configで簡単にポート番号を変えられれますので、どのネットワークでもまず閉じられていないtcp/443(SSL)に変えてしまうという手があります。しかしながら、webサーバを立ち上げているサーバでは当然443は占拠されているので、今回のsslhを使ってクライアントのリクエストに応じて適切なサービスに割り振ることをします。

インストール

Debianではパッケージがありましたので、そこからインストールします。

# apt install sslh

最初に、inetdで起動するか、standaloneで起動するか聞いてきます。sshもhttpdもstandaloneで動いているわけですし、sslhも素直にstandaloneにしておきます。

既存サービスのポート変更

httpd

私はApacheを使っていますので、/etc/apache2/ports.confを書き換えました。

Listen 80

<IfModule ssl_module>
 Listen localhost:443
</IfModule>

<IfModule mod_gnutls.c>
 Listen localhost:443
</IfModule>

ポート番号はそのままに、待ち受けるアドレスをlocalhostにしています。編集後にapacheの再起動。

ssh

/etc/ssh/sshd_configを編集します。

#Port 22
Port 12345
Port 23456

もともとの22番はコメントアウトしています。22番ポートへの攻撃は多いのであえて閉じています。そのあとにある12345,23456が待ち受けポートです(本当は違う値ですけど)。編集後にsshdの再起動。

sslhの設定

sslhの設定は/etc/default/sslhです。

RUN=yes
DAEMON_OPTS="--user sslh --listen xxx.xxx.xx.x:443 --listen xxxx:xxx:xx:x:x:x:x:x:443 --ssh 127.0.0.1:12345 --ssl 127.0.0.1:443 --pidfile /var/run/sslh/sslh.pid"

変更箇所は2行です。–listenでまちうけのアドレスとポートを指定します。–sshでsshのポート番号を、–sslでhttpdのポート番号を指定しています。編集後にsslhの再起動をします。

まちうけにはIPv4もIPv6の両方共いけました。転送先のアドレス(127.0.0.1)がIPv4しか書いてないのに、IPv6でsshのコネクションが張れていまいち謎な感じですけど、できてしまいました。一種のIPv6トランスレーター的な動きをしているのかもしれません。

確認

httpdの確認は通常のブラウザから出来ます。sshはポート番号を変えましたので以下のようにつなぎます。

$ ssh -p 12345 サーバのアドレスなど

毎回ポート番号を書くのが面倒であればconfigに書くのがいいでしょう。

注意

リモートのサーバを編集するときは注意しましょう。設定を間違えると2度と繋がらなくなる可能性があります。sshなどは設定を変更してサービス再起動しても、今あるセッションはそのまま残りますので、設定が完全に出来上がって問題なくなるまで、作業中は切断しないようにするといいと思います。

 

おうちハックで二酸化炭素モニター

NetAtmoという製品があります。フランスのメーカーで、簡易的な気象観測ができるセンサーとクラウドでデータを参照できるサービスを売っています。普通に日本のアマゾンとかで買えます。 URL(AA)

室外ユニットと室内ユニットセットになっていて、測定できる値は、室外が気温と湿度、室内が気温と湿度に加えて、気圧と騒音(デシベル)と二酸化炭素濃度です。この手の製品で気温、湿度、気圧はよくあるのですが、騒音と二酸化炭素はちょっとめずらしいです。
二酸化炭素は実は測定が難しいのです。二酸化炭素が赤外線を吸収する性質を利用して、赤外線光源と赤外線センサーの組み合わせで吸光度を測るようなのですが、キャリブレーションが大変なようで精度があまり出ません。おまけにセンサーとしての価格が高い。それを1万そこそこで売っているのはなかなかお買い得な感じです。キャリブレーションは室外ユニットにもセンサーが入っていて、大気の二酸化炭素濃度を400ppmとしてキャリブレーションしているのではないかと思われます。

これで室内の二酸化炭素をモニターしているのですが、ちょっとしたことで二酸化炭素はすぐに上がります。石油ストーブであっという間に数千ppmに、調理するだけでもすぐに上がるし、なんなら締め切った部屋で寝てるだけでも1000ppm超えたりします。
1000ppm以下ががきれいな空気の目安らしく、高くなればなるほど、眠くなったり気分が悪くなったりいいことがないので、1000ppmを超えないように気をつけます。

二酸化炭素濃度の数値はwebやスマホで見られるのですが、一手間かかるので電光表示板を作ることにしました。NetAtmoはAPIを公開していて、(一定の範囲内なら)好きなだけインターネット経由で測定値を取ってこれます。これをRaspberry Pi なんかで取得して7セグLEDで表示させています。
Raspberry Pi を使ったついでに、1000ppmを超えたときは警告をTwitterで通知するようにしています。さらに、うちで昼間は常時起動しているPCに読み上げソフトをインストールして、音声で警告も出してくれるようにしました。

おかげさまで、二酸化炭素濃度にはかなり敏感なお家になりました。