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 のマニュアルを読めば良い。
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 の公式マニュアルに従って最低限のセキュリティ設定を行った。
今回は、もう一歩進んだ設定を行う。内容としては、以下のパッケージを導入する。
- etckeeper
- yum-cron
- fail2ban
- rkhunter
ついでに
- logrotate の周期の変更
も行った。手順は以下に書かれている内容をフォローした。
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.conf
の port=ssh
を port=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 円ですごく安い。
ソフトウェアをインストールする前に、セキュリティ上で重要な設定を行う必要があるのだが、その手順は公式マニュアルとして整備されている。
この記事では公式マニュアルの内容をまとめる。
最低限の設定
サーバの起動・ログイン
サーバの起動は 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 ...
以上で最低限の設定は完了した。