Python3 から I2C を使いたい

Raspberry Pi 上で Python から I2C を使う方法として、ググってよく見つかるのには

$ sudo apt-get install python-smbus

というのがある。しかし、このパッケージは Python2 からしか使えない。 Python3 から使うには

$ sudo apt-get install python3-smbus

とする。これで

>>> import smbus

ができるようになる。

SSH_ASKPASS について

走り書き程度のメモ。 例えば、gitbucket 上のプライベートなリポジトリからクローンしようと思ったとき

$ git clone http://user@example.com/gitbucket/hoge/fuga.git

とやるが、パスワードの入力を促す GUI ダイアログが立ち上がる場合がある。 ものによると思うが、パスワードがキャッシュされてしまうことがあるので、共用のマシンだと ちょっと困る。このダイアログを無効化するには環境変数 SSH_ASKPASS を消してしまえばいい。

$ unset SSH_ASKPASS

これで、パスワードの入力はコマンドライン上で出来るようになり、キャッシュもされなくなるようだ。

ifcfg-ethx について

今まで、CentOS6マシンに固定IPを振るとき /etc/sysconfig/network-scripts/ifcfg-ethx

DEVICE="ethx"
HWADDR=xx:xx:xx:xx:xx:xx
BOOTPROTO="static"
IPADDR=192.168.xxx.xxx
NETMASK=255.255.255.0
ONBOOT="yes"
NM_CONTROLLED="no"

と書いていた。 しかし、 http://aikotobaha.blogspot.jp/2011/09/rhel6sl6centos6.html によれば、HWADDR は不要らしい。 というのは、MAC アドレスは udev の方で ethx とすでに紐付けられているから。単に冗長な記述となってしまう。

ifcfg-ethx の書き方に関して、もっと詳しくは RHEL6 のマニュアルを読めば良い。

9.2. インターフェース設定ファイル

Homebrew でインストールした readline が使えない問題

macOS Sierra に Homebrew で readline をインストールした。

$ brew install readline

しかしながら、readline を参照するプログラムがコンパイルできないという問題が発生した。 /usr/local 以下をチェックしてみると、readline 関係の諸々は一切見当たらない。 なんで?と思ったのだが、どうやら readline は keg-only らしい。 keg-only なフォーミュラはシンボリックリンクが作られない。 keg-only かどうかは brew info で確認できる。

$ brew info readline
readline: stable 7.0.3 (bottled) [keg-only]
Library for command-line editing
https://tiswww.case.edu/php/chet/readline/rltop.html
/usr/local/Cellar/readline/7.0.3_1 (46 files, 1.5MB)
  Poured from bottle on 2017-06-23 at 02:36:12
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/readline.rb
==> Caveats
This formula is keg-only, which means it was not symlinked into /usr/local,
because macOS provides the BSD libedit library, which shadows libreadline.
In order to prevent conflicts when programs look for libreadline we are
defaulting this GNU Readline installation to keg-only..

For compilers to find this software you may need to set:
    LDFLAGS:  -L/usr/local/opt/readline/lib
    CPPFLAGS: -I/usr/local/opt/readline/include

理由は様々なのだろうが、readline の場合は libedit と干渉するから、とのこと。 そんなわけで、-L/usr/local/opt/readline/lib -I/usr/local/opt/readline/include を自分の Makefile に書き加えたら コンパイルが通るようになった。 まあ事前に brew info しとけばハマらずに済んだということ。

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

さくらの 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
...

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