読者です 読者をやめる 読者になる 読者になる

Python3 と tee コマンドを組み合わせたときにハマった

print() で標準出力にメッセージを出力する Python スクリプトがあったとする。 その出力を画面で見ながらファイルにも書き出したいというときには、tee コマンドを使う。

$ ./example.py | tee example.log
...

しかしながら、スクリプトを実行中に画面には何も現れないということが起こりうる。 これは標準出力がバッファリングされるからで、この問題は以下を参照して解決した。

pythonで標準出力のバッファリングを無効にする - blog.mouten.info

-u オプションを使って、バッファリングを無効化すれば良い。 結局のところ、以下のような感じにすればよろしい。

$ python3 -u example.py | tee example.log
...

Git hooks を python でつかう

普通はシェルスクリプトでやるのだろうが、python で Git hooks をつかうことができる。 ここでは、例として特定のファイルの文字数をコミット後に数えるというのをやってみる。 .git/hooks/post-commit を以下のように作成した。

#!/usr/bin/env python3

import time

with open(’hoge.txt', 'r') as fi:
    s = fi.read()

with open('progress.txt', 'a') as fo:
    out = '{0:d} {1:d}\n'.format(round(time.time()), len(s))
    fo.write(out)

git commit すると、タイムスタンプと文字数が記録されていく。

rkhunter の warning を解消する

rkhunter でスキャンをかけると以下のように2つのワーニングが出た。

$ sudo rkhunter --check --skip-keypress --report-warnings-only
Warning: The SSH and rkhunter configuration options should be the same:
         SSH configuration option 'PermitRootLogin': no
         Rkhunter configuration option 'ALLOW_SSH_ROOT_USER': unset
Warning: Suspicious file types found in /dev:
         /dev/.udev/tmp-rules--70-persistent-net.rules: ASCII English text
         /dev/.udev/tmp-rules--70-persistent-cd.rules: ASCII English text

これを解決するために、/etc/rkhunter.conf を編集する。 1番目のワーニングについては、ALLOW_SSH_ROOT_USER=no と書き換えればよい。 2番目のワーニングは ALLOWDEVFILE=*** を追加することで解消する。 rkhunter.conf の編集前後での diff を取ると以下のようになる。

@@ -310,7 +310,7 @@ AUTO_X_DETECT=1
 # The default value is 'no'.
 #
 #ALLOW_SSH_ROOT_USER=no
-ALLOW_SSH_ROOT_USER=unset
+ALLOW_SSH_ROOT_USER=no
 
 #
 # Set this option to '1' to allow the use of the SSH-1 protocol, but note
@@ -758,6 +758,9 @@ ALLOWDEVFILE=/dev/.udev/rules.d/99-root.rules
 ALLOWDEVFILE="/dev/md/autorebuild.pid"
 # 389 Directory Server
 ALLOWDEVFILE=/dev/shm/sem.slapd-*.stats
+# added manually
+ALLOWDEVFILE="/dev/.udev/tmp-rules--70-persistent-net.rules"
+ALLOWDEVFILE="/dev/.udev/tmp-rules--70-persistent-cd.rules"

編集後には以下のコマンドを実行する必要がある。

$ sudo rkhunter --propupd

大変面白いブログを見つけた

blog.matsumoto-r.jp

すごいです。

さくらの VPS を使ってみる・続

前回の記事では、さくらの VPS の公式マニュアルに従って最低限のセキュリティ設定を行った。

nucl.hatenablog.com

今回は、もう一歩進んだ設定を行う。内容としては、以下のパッケージを導入する。

  • etckeeper
  • yum-cron
  • fail2ban
  • rkhunter

ついでに

  • logrotate の周期の変更

も行った。手順は以下に書かれている内容をフォローした。

nekopunch.hatenablog.com

etckeeper の導入

その名の通り、設定ファイル(/etc 以下のファイル)をバージョン管理するためのパッケージ。 できるだけ早い段階で導入するのが良いと思われる。私の場合は、前の記事で紹介した最低限の 設定が完了した段階で導入することにした。 etckeeper は yum でインストールできる。

# yum -y install etckeeper

CentOS ならば、etckeeper はバージョン管理のために git を使うようになっていて、 管理対象外のファイルの設定は git の流儀で行うことができる。 デフォルトでは /etc/passwd/etc/shadow も管理対象下に置かれてしまうそうなので、これらを外しておく。そのために .gitignore/etc 以下に置く。内容は以下のとおり。

shadow*
gshadow*
passwd*
gpasswd*

以下のコマンドで現在の状態を記録する。

# etckeeper init
# etckeeper commit

git log で initial commit が見えるようになっているはず。

etckeeper は毎日自動的にコミットしてくれるのだが、/etc/crontab を覗いてみてもその記述は見当たらない。 これはどういうことかというと、CentOS 6 の場合、cron ではなく anacron によってスケジューリングされているからだ。ちなみに、anacron のスケジューリング設定は /etc/anacrontab に書かれていて、そこから /etc/cron.daily/etckeeper が間接的に呼びだされる仕組みになっている(らしい)。

yum-cron

最新のパッケージを自動的に拾ってきてくれる。 インストールは yum で行う。自動的に起動するように設定しておく。

# yum -y install yum-cron
# service yum-cron start
# chkconfig yum-cron on

こちらも anacron によって毎日 /etc/cron.daily/0yum.cron が呼び出されている。

fail2ban の導入

ブルートフォースアタック対策のために導入する。事前に jail.confport=sshport=50022 に書き換えておくことが必要。

# yum -y install fail2ban
# vim /etc/fail2ban/jail.conf

自動的に起動するように設定する。

# service fail2ban start
# chkconfig fail2ban on

rkhunter の導入

ルートキット対策のために入れる。インストール後は定義ファイルの更新をしておく。

# yum -y install rkhunte
# rkhunter --update
# rkhunter --propupd

早速スキャンをかけてみる。

# rkhunter --check --skip-keypress --report-warnings-only
Warning: The SSH and rkhunter configuration options should be the same:
         SSH configuration option 'PermitRootLogin': no
         Rkhunter configuration option 'ALLOW_SSH_ROOT_USER': unset
Warning: Suspicious file types found in /dev:
         /dev/.udev/tmp-rules--70-persistent-net.rules: ASCII English text
         /dev/.udev/tmp-rules--70-persistent-cd.rules: ASCII English text

警告がいくつか出た。これらの解消法はまた後で調べることとする。

logrotate の設定を変更

ログをもっと長い期間保存するように変更した。 etckeeper のおかげで、差分を見るのも簡単になり、変更点がすぐ分かる。

diff --git a/logrotate.conf b/logrotate.conf
index 7da6bb7..753baf5 100644
--- a/logrotate.conf
+++ b/logrotate.conf
@@ -1,9 +1,9 @@
 # see "man logrotate" for details
-# rotate log files weekly
-weekly
+# rotate log files monthly
+monthly
 
-# keep 4 weeks worth of backlogs
-rotate 4
+# keep 12 months worth of backlogs
+rotate 12

さくらの VPS を使ってみる

色々と便利に使えるかと思ってさくらの VPS を契約した。 プランは 1 core 512 MB を選択した。大量のファイルを置くことも考えてストレージは HDD 100 GB を選んだ。 リージョンは東京と石狩が選べたが、まあ東京にしておけばいいだろうと思った。ちなみに料金は月額で 685 円ですごく安い。

ソフトウェアをインストールする前に、セキュリティ上で重要な設定を行う必要があるのだが、その手順は公式マニュアルとして整備されている。

help.sakura.ad.jp

この記事では公式マニュアルの内容をまとめる。

最低限の設定

サーバの起動・ログイン

サーバの起動は Web 上でポチポチやると簡単にできる。まずは root でログインするのだが、初回起動時はログインできるようになるまで(数時間?)少し時間がかかった。 ちなみに root のパスワードは登録後すぐにメールで送られてくる。 ローカルから

local$ ssh root@xxx.xxx.xxx.xxx

とやって VPS にログインする。

root パスワードの変更

標題の通り。

# passwd

ユーザーの追加

# useradd hoge
# passwd hoge

ユーザー hoge を sudoer に加えて、sudo できるようにする。 そのためには、hoge を wheel グループに属させる必要がある。

# usermod -G wheel hoge
# visudo

visudo で何をするかというと

# %wheel ALL=(ALL) ALL 

の行のコメントアウトを外す。

local$ ssh hoge@xxx.xxx.xxx.xxx

でログインできることを確かめる。念のため sudo が使えることを確かめておく。例えば以下のようにやってみる。

$ sudo shutdown -h now

SSH 周りの設定

まずは、公開鍵認証のために鍵ペアをローカルでつくる。

local$ ssh-keygen -t rsa

出来上がった id_rsa の中身(ssh-rsa ******* みたいなやつ)を VPS 上の authorized_keys にコピペする。

$ mkdir .ssh
$ chmod 700 .ssh
$ cd .ssh
$ echo ssh-rsa ******* > authorized_keys
$ chmod 600 authorized_keys 

sshd_config 以下のように書き換える。

  • ポート番号を 22 以外に変更
  • root ログイン禁止
  • パスワード認証禁止
$ sudo vi /etc/ssh/sshd_config
...
#Port22 
...
#PermitRootLogin yes
...
PasswordAuthentication yes
...

これを

...
Port50022 
...
PermitRootLogin no
...
PasswordAuthentication no
...

のように書き換えた。リロードして設定完了。

$ sudo /etc/rc.d/init.d/sshd reload

パッケージのアップデート

ものの数秒で終了した。

$ sudo yum update

ファイアーウォールの設定

HTTP(S) と SSH だけ開けておいた。iptables -A INPUT -p tcp -m tcp --dport 50022 -j ACCEPT を忘れると詰む。

$ su -
# iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
# iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
# iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A INPUT -p icmp -j ACCEPT
# iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
# iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
# iptables -A INPUT -p tcp -m tcp --dport 50022 -j ACCEPT
# iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -P INPUT DROP
# iptables -P OUTPUT ACCEPT
# service iptables save
# cat /etc/sysconfig/iptables
...
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [4:528]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP 
-A INPUT -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j DROP 
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP 
-A INPUT -i lo -j ACCEPT 
-A INPUT -p icmp -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 50022 -j ACCEPT 
COMMIT
...

以上で最低限の設定は完了した。

ユーザー領域に zsh をインストールした

共用のサーバに zsh をインストールした時のメモ。 現時点で最新のバージョンは 5.2 らしい。sourceforge からダウンロードする。 インストール先は /home/username/local を想定している。

$ wget http://downloads.sourceforge.net/project/zsh/zsh/5.2/zsh-5.2.tar.gz?r=https%3A%2F%2Fsourceforge.net%2Fprojects%2Fzsh%2Ffiles%2Fzsh%2F5.2%2F&ts=1470114499&use_mirror=jaist
$ tar xvfz zsh-5.2.tar.gz
$ cd zsh-5.2
$ ./configure --prefix=/home/username/local
$ make
$ make install

ログインシェルを変更するには

$ chsh -s /path/to/shell

とやるが、共用サーバなので

chsh: "/home/username/local/bin/zsh" is not listed in /etc/shells.

となってしまう。この場合は、ログインシェルは bash(ウチの場合)のままで、.bashrc

exec ~/local/bin/zsh

と書いて対処するしかないらしい。

superuser.com

しかし、これをやると scprsync を使ってファイルがコピーできなくなるので致命的である。 何か代わりの良い方法はないだろうか?

X11 connection rejected because of wrong authentication でハマった話

いつもどおりリモートに接続し、X を飛ばそうと思ったのだが

remote$ xeyes
X11 connection rejected because of wrong authentication.
X connection to localhost:11.0 broken (explicit kill or server shutdown).

と出た。

remote$ xauth list

は何も返してこない。困っていた時にネット上で発見したのが以下。 answers.launchpad.net リンク先の最後のポストにあるように、ディスク容量を 100% 使いきっていたのが原因だった。$ rm hogehoge で綺麗にしたら、詳しくは知らないが xauth のクッキーなるものが自動的に生成されるようになった。これで X が飛ぶようになってめでたく解決。

matplotlib のフォントを Helvetica に変える

matplotlib のフォントはデフォルトで Bitstream Vera Sans というものになっているが、特に数字の見栄えがよろしくない。 そこで、Helvetica に変えてしまおうというのが主題。 環境は python3.5、OS X 10.9.5 上で走っている。 まずはこのポストを参考にした。How to set Helvetica as the default sans-serif font in Matplotlib // Science, meet productivity // A computational RNA biologist exploring productivity, python, and reproducibility. しかしこれではうまくいかない。 結局たどり着いたのがこれ。 osx - cannot change font to Helvetica in Matplotlib in Python on Mac OS X 10.6 - Stack Overflow

fondu は homebrew で入れておく。

$ python3 -c "import matplotlib ; print(matplotlib.matplotlib_fname())" 
/Users/***/.matplotlib/matplotlibrc
$ mkdir ~/Desktop/font_copies
$ cp /System/Library/Fonts/Helvetica.dfont ~/Desktop/font_copies
$ cd /Users/***/.matplotlib/fonts/ttf/
$ fondu -show ~/Desktop/font_copies/Helvetica.dfont
$ rm ~/.matplotlib/fontList.py3k.cache

この手順でめでたく Helvetica 化に成功した。

年の瀬

特に記事を書くモチベーションがなくなってしまった。きちんとした記事を書かなければならないという考えが邪魔をしている。 アクセス解析を見ると、Poisson の和公式がよく見られているらしい。 信号処理をもう一度勉強しておきたいと思う今日この頃。

他になにか書くネタあったっけ。

  • Markdown に関する個人的メモ
  • サンプリング定理
  • KiCAD で基板設計

ぐらいか。ああ、あと先週買ったカメラのレビューとか。