きりのブログ

パソコン、開発関係の思いつきと作業記録

ラズパイで温度監視

諸事情で部屋の温度監視が必要になったのでラズパイで作ってみた。以前から興味はあったけど用途が思いつかなかったのでこれ幸いと初挑戦。

 買ったもの

Raspberry Pi Zero WH(スターターキット)
USB電源(ラズパイ3対応のスイッチ付き 5V 2.5A)
microSD(32GB Class10)
DHT11温度センサーモジュール

全部で約5,400円。

 

初期設定 

 PC(Win10)にてmicroSDをフォーマット後、ダウンロードしたraspbian Stretch LiteをEtcherで焼き焼き。ヘッドレスセットアップするのでbootパーティションと思しきところに中身空の「ssh」というファイルを作成。wpa_supplicant.confファイルも作成してWiFiの接続情報を記入。詳細はググってください。

ラズパイにmicroSDをセットして起動し、PCからraspberrypi.local宛でssh接続まで確認。pi/raspberryでログインできる。(bonjourはじめて知った)

プロキシ環境下なので環境変数を.bash_profileにセット。

$ vi ~/.bash_profile


export HTTP_PROXY=http://xxxx:nn
export HTTPS_PROXY=https://xxxx:nn
export FTP_PROXY=ftp://xxxx:nn

再ログインして色々更新しておく。

$ sudo apt-get update
$ sudo apt-get upgrade 

 ローカライゼーション関係を設定。

$ sudo raspi-config

日時合わせの設定。参照するNTPサーバーを設定する。

$ vi /etc/systemd/timesyncd.conf

一応パスワード変えておく。

$ passwd

 作るもの

温湿度センサーDHT11からpythonでデータを読み込んで、1時間毎にMicrosoft Teamsに投稿する。

$ sudo apt-get install git
$ sudo apt-get install python3-pip
$ vi .gitconfig


[http]
proxy = http://xxxx:nn
[https]
proxy = https://xxxx:nn
[url "https://"]
insteadOf = git://

 

$ git clone https://github.com/szazo/DHT11_Python.git
$ sudo pip install rpi.gpio --proxy=xxxx:nn

配線

DHT11は基盤付きの3本足。+を3.3V、outをGPIO17、-をGNDに接続。

テスト

ライブラリ付属のサンプルを、GPIOのところだけ修正して実行してみる。

$ cd ~/DHT11_Python
$ vi dht11_example.py
(GPIOの番号を修正)
$ python3 dht11_example.py

サンプルは1秒毎に測定結果を表示するものだが、はじめの1回しか表示されない。あとは何分待ってもずっとエラー・・・

$ python dht11_example.py

毎秒とはいかないが、5秒に1回ぐらいは表示される。python3系だと上手くいかないらしい。2系でもエラー多すぎだが。原因はよくわからん・・・とりあえず、2系で続きをやる。

Microsoft Teamsに投稿

Teamsにチャンネル作って、コネクタからIncoming Webhookをセットアップ。URLを控えておく。

$ sudo pip install requests --proxy=xxxx:nn

投稿のサンプルはコレ。

# -*- coding: utf-8 -*-
import requests, json

WEB_HOOK_URL = "https://outlook.office.com/webhook/xxxx"
requests.post(WEB_HOOK_URL, data = json.dumps({
    'text': u'通知内容',
}))

 

$ python test.py

requestsがないと怒られる。pipがpython3系だったのが原因だった。get-pip.pyなるもので取ってこれるらしいので、curlで取ってくる。の前に準備。

$ vi ~/.curlrc


proxy="http://xxxx:nn"

 

$ curl -O https://bootstrap.pypa.io/2.6/get-pip.py
$ sudo python get-pip.py

$ sudo pip install requests --proxy=xxxx:nn

これで投稿できるようになった。

仕上げ

DHT11のサンプルとTeams投稿サンプルを組み合わせてスクリプトを作成。常駐ではなくcronで1時間毎に起動する。

# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import dht11
import time
import datetime
import requests
import json

# Teams webhook url
WEB_HOOK_URL = "https://outlook.office.com/webhook/xxxx"

# initialize GPIO
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.cleanup()

# read data using pin 14
#instance = dht11.DHT11(pin=14)
instance = dht11.DHT11(pin=17)

counter = 0

while True:
    counter += 1
    result = instance.read()
    if result.is_valid():
        requests.post(WEB_HOOK_URL, data = json.dumps({
            'text': u'室温 %d C' % result.temperature,
        }))
        break
    else:
        if counter > 20:
            requests.post(WEB_HOOK_URL, data = json.dumps({
                'text': 'failed.',
            }))
        break

    time.sleep(2)

GPIO.cleanup()

 このままcronで起動しても環境変数読み込まないのでプロキシ超えられない。bashでラップする。(-lオプション)

$ vi tempmonitor.sh

 

#! /bin/bash -l

python /home/pi/tempmonitor/tempmonitor.py

 

$ chmod +x /home/pi/tempmonitor/tempmonitor.sh

$ crontab -e

0 * * * * /home/pi/tempmonitor/tempmonitor.sh 

 感想

  • 初ラズパイ、初python、初bot(?)。楽しいヽ(=´▽`=)ノ
  • pythonのバージョン環境よくわからん。pyenv使えば楽なのかしらん。
  • プロキシ面倒

安定稼働したら指定温度以上になったときだけ投稿するように修正する予定。

IIJmioを家族で使う場合のプラン選び

音声通話機能付きSIM(みおふぉん)を家族(2~5人)で使うときに、どのプランを選ぶのがいいのかなー、と思い計算してみた。データ通信はミニマムスタートプラン(3GB/月 1ヶ月繰越可)で十分過ぎるので、実質1.5GB/人の場合も計算してみた。なお、ライトスタートプランはミニマムスタートプランのデータ通信量増額版なので除外した。

 

2人

ミニマム 2契約・・・(900+700)*2=3,200円

ミニマム 1契約SIM2枚・・・900+700*2+400=2,700円

ファミリーシェアプランSIM2枚・・・2,560+700*2=3,960円

 

3人

ミニマム 3契約・・・(900+700)*3=4,800円

ミニマムSIM2枚+ミニマムSIM1枚・・・(900+700*2+400)+(900+700)=4,300円

ファミリーシェアプランSIM3枚・・・2,560+700*3=4,660円

 

4人

ミニマム 4契約・・・(900+700)*4=6,400円

ミニマムSIM2枚を2契約・・・(900+700*2+400)*2=5,400円

ファミリーシェアプランSIM4枚・・・2,560+700*4+400=5,760円

 

5人

ミニマム 5契約・・・(900+700)*5=8,000円

ミニマムSIM2枚を2契約+ミニマムSIM1枚・・・5,400+1,600=7,000円

ファミリーシェアプランSIM5枚・・・2,560+700*5+400*2=6,860円

 

2~4人まではミニマムスタートプランで約1.5GB/人で我慢するのが安く、5人以上はファミリーシェアプランにまとめた方が安くなる。追加SIM使用料400円は絶妙な価格設定だなぁと感心してしまった。

データ通信の使用量は人それぞれなので1.5GB/月で足りない場合は早めにファミリーシェアプランへまとめることになる。

なお、IIJmioは名義変更できないので、子供が18歳になり支払いを別にしたい時は名義者でMNP転出後に、転出先で名義変更するしかない(名義変更できないMVNOに転出しちゃ駄目)。もしくは番号維持を諦めて解約&新規契約となる。不便。

まだ机上の空論なので3回線目契約して確認したいと思います。

HUAWEI nova lite 2を購入

去年の12月中旬にNexus5Xがお亡くなりになり、昔使っていたXperia Z Ultraを引っ張り出してコスパの良い安い端末が出るのを待っていました。Nexus5Xを買ったのが2016年3月で2年は空けたいなぁと思い、HUAWEI P10 liteの購入は見送って次の同価格帯の端末が出たら買うつもりでした。

2月頭にnova lite 2が出たのでキャンペーンを待って購入。私の場合はIIJmioの買い替えキャンペーンにより実質18,800円でした。

 

良い点

サイズ
Z Ultraからの変更なので尚更。手のひらスッポリ。ベストはiPhone SEですけど。

カメラ
まだ十分使っていませんが、画質・速度共に満足。光学手ブレ補正はなし。

性能
必要十分。ゲームもこなせる。

センサー
GPSは掴み良い方。疑似ジャイロもあり問題なし。指紋ロック解除早くてビビる。

 

悪い点

バッテリー
容量は普通。保ちも普通。急速充電ないのは妥協点。

曲面ガラス
フィルム貼る人は要注意。

 

感想

ランチャーのEMUIに慣れるかちょっと不安。ダメなら変えてみるつもり。日常使いには問題ないし持ち運びも楽なので、価格を考えれば満足。良い買い物でした。

デスクトップPCのHDDをSSDに換装

今更ですがHDDからSSDに換装してみました。

2009年にWindows7クリーンインストールし、無償バージョンアップを経てWindows10にして使っていたので8年以上使っていたことになります。不良セクタが発生することもなくアクセスに問題ありませんでした。しかしHDDへのアクセスが多くCPUが遊んでいる時間が長かったりと年々動作が遅くなっていました。

これを機に第8世代コアプロセッサー(CoffeeLake)のCPUに更新し、ついでに電源とケースも更新したかったのですがHDDの容量が逼迫してきたこともあり安価に効果の見込めるSSDへの換装に踏み切りました。

スペック

ケース: Century CF-A8989WT150
CPU: Intel Core i5-2405S
M/B: ASRock Z68M-ITX/HT
HDD: 日立GST Deskstar P7K500 HDP725050GLA360

HDDは約200GBずつC、Dにパーティションを分けていました。これをCとシステム関係のパーティションSSDに移動し、Dを新しいHDDに移動しました。

用意したストレージ等

SSD:  SanDisk SSD PLUS 480GB SDSSDA-480G-J26 (16,193円)
HDD: WD Blue WD40EZRZ-RT2(10,583円)
変換マウンタ: ELUTENG 5.25インチベイ用 ネジセット付き 2.5 3.5 インチ 変換 マウンタ(459円)

SSDは480GB、HDDは4TBです。ケースには3.5インチシャドウベイと光学ドライブ用の5.25インチベイしかなく、空いている5.25インチベイにSSDを収めるため変換マウンタも買いました。HDDはビデオやら写真やら貯めておくので、思い切って大容量のものにしました。しめて27,235円でした。

使用したソフト

EaseUS Todo Backup Free(v10.6.0.0)
EaseUS Partition Master Free(v12.5)

手順(HDD→SSD

高速スタートアップを使わないよう電源を落とし、電源コードを抜きます(Shiftキー押しながら再起動を選ぶ、など)。次にSSDを接続してPCを起動、続けてEaseUS Todo BackupでHDDをSSDにクローン。「SSDに最適化」のチェックボックはオンにしておきます。SSDの方が容量小さいですが、いい感じに処理してくれました。所要時間2時間ぐらい。

これでC、Dとシステム関連パーティションも含めてまるっとSSDに入りました。再び電源を落としてHDDを取り外し起動することを確認します。Windowsのライセンス認証は保たれたままでした。また、万一のためWindowsのシステム修復ディスクを作っておくと安心ですが、今回は使いませんでしたが。

手順(Dパーティションの新HDDへの移動と容量拡張)

SSDに入っているDドライブを新しいHDDに移動し、CとDのパーティションサイズを変更します。

電源を落とし新しいHDDを取り付けます。PCを起動したら、EaseUS Partition Masterを起動。新しいHDDはMBR形式で1パーティション2TBまでしか広げられないのでGPT形式に変更して「適用」。続けて、

  1. SSDのDパーティションを新HDDにコピー
  2. SSDのDパーティションを削除
  3. SSDのCパーティションの後ろにある回復パーティションをディスクの最後に移動
  4. SSDのCパーティションの容量拡張
  5. HDDのD(予定)パーティションの容量拡張
  6. D(予定)パーティションのドライブレターをDに変更

ここまで操作して「適用」します。

私の場合、一部ソフトがDドライブから起動していたため2番目のDパーティションの削除でコケましたが、該当ソフトを終了して2番目からリトライしたら上手く行きました。何度か再起動されますがじっと待ちます。

特に問題なく完了。これで速度も上がり容量も増えました。

結果

Cドライブ 200GB → 400GB
Dドライブ 200GB → 4TB

第2世代CPUなので6世代落ちですがサクサク動きます。まだまだ使えそうですが先に電源がヘタりそうでちょっと怖いです。

これまで使っていたHDDが浮いてしまったので何に使おうか悩んでます。ケースに空きベイがないので、外付けケースでUSB接続してもいいんですが既にひとつ繋がってるしなぁ・・・。とりあえず予備として大事にしまっておきます。

I5 Plusを買ってみた

知人からの紹介で、あまりの安さに衝動買いしました。既に後継品が出ているらしく2,000円もしませんでした。Amazonでは「I5 Plus スマートウォッチ Bluetooth 4.0 日本語対応 (ブラック)」という品名で出ていました。

全く下調べせずに買ったのですが、後から調べると数社から同製品が販売されているようです。私のはiWOWNという会社のもの。他社のものと全く同じかは分かりませんが、多分一緒でしょう。

これ単体では通信機能やGPSはありません。本体では設定も何もないので時計と万歩計としてぐらいは使えるかも知れませんが、基本はスマートフォンと連携して使うものです。

主な用途は活動量計の機能みたいですが、私はスマホの着信や通知を拾って、振動とともに内容表示してくれるのに魅力を感じました。普段は腕時計付けないのですが、これなら使い続けられるかも、と期待しています。

スマートフォンに導入するアプリは数種類あるようですが、私は取説に従ってiWOWNfit proを使っています。まだ数日ですが今のところ問題なさそう。

Bluetoothでのペアリングはアプリから行えます。アプリではなくOSの機能でもペアリングできます。はじめはAndroidBluetoothペアリング探索で表示されませんでしたが、スマホを再起動したらここからでもペアリング出来るようになりました。OS機能でペアリングするとSmart Lockで使えるので便利かもしれません。(指紋認証でロック解除するのであんまり関係ないんだけど。)

戸惑ったのはI5 PlusのBluetooth接続を示すアイコンがいつの間にか消えてしまうこと。ペアリング解除されているのでは、と不安になりますが電話着信時に通知飛んで来るので大丈夫・・・かもしれない。しばらく様子を見てみます。

また、常にBluetoothをオンにしておくのでスマホ本体の電池持ちが心配です。Nexus 5X 電池持ち悪いのよね。

しばらく使ってみて、メリット・デメリット、不具合などあれば追記したいと思います。

Nexus 5X 再起動ループへの対処

Nexus 5Xを使っているのですが、先日朝起きてブラウジングしようとしたら固まって再起動。そのまま再起動ループに陥りました。

最近ちょっと電波の掴みが悪いかなー、とか昨日小雨の中使ったからかなーと不具合に至る前兆やら原因やら思い当たる節がなくもなかったのですがハッキリしません。

Nexus 5Xは2015年9月に発表された機種で、2016年に再起動ループの報告が多発しLGが返金対応すると話題になりました。私は2016年3月にExpansysで購入しましたがこの問題は起きずにここまで来ました。

Nexus 5X、再起動ループ問題でLGが全額返金を開始。部品在庫なしで事実上の「リコール」か。 | スマホ評価・不具合ニュース

まだ返金対応もしくは交換対応しているのかと調べたのですが、どうやらメーカー保証の1年以内でないと修理扱いになるようです。修理だと4万円近くなるらしく、これなら買い替えた方が良さそうと判断しました。

Nexus 5X 再起動ループでLGへ修理依頼 - IT系会社員ブロガー

そこまでヘビーに使うこともないので、HUAWEI P10 liteが候補です。コスパ大事。

HUAWEI P10 lite スマートフォン | 携帯電話 | HUAWEI Japan

とはいえ、最低2年は使いたかったし、どうせ捨てるのならと悪あがきしてみたらできちゃったのでφ(..)メモメモ

 

通り一遍の対応は試しました。(電源入れ直し、バッテリー放電、SIM抜き差し、電源ボタン連打、リカバリーモード)。結果として、Googleロゴから先に進むこともありましたが、基本的には症状変わらず。一度だけ起動したものの数秒でフリーズしてしまいました。

どうせ捨てるならと最終手段でOSイメージの焼き直しとパッチ当てを試みました。参考にしたのはこちら。

ジャンク品のnexus5xを電子レンジとパッチで直す。 – return $lock;

Nexus5Xを工場出荷時初期化~Xposed導入まで - akashisnの日記

まずはブートローダーをアンロックしなければなりませんが、そのためには短時間でも起動しなければなりません。上記ページではオーブンでマザーボード温めてますがかなり面倒です。主に分解が。自分不器用なので。

で、電源入れ直しとかしてて気付いたのですが、ある程度放置してから電源入れると先に進みやすい気がしました。温めたほうが進みやすい、という情報もありましたが、私の場合は冷やしたほうが進みやすそうと判断。

安直に冷凍庫に1分入れてから起動してみると、Androidロゴまで進み再起動。あと一歩。というわけで、さらに1分入れてから試したら起動しましたヽ(=´▽`=)ノ

注意: やりすぎると取り出した時に結露で壊れます。特に夏は危険です。真似る時は自己責任で(お約束)

起動したら大急ぎでビルド番号連打して開発者オプション有効にし、OEMロック解除、USBデバッグを有効にします(USBデバッグは不要かも?)。念のためシャットダウン後、電源ボタン+音量下げボタン同時押しでブートローダーの画面にします。

後は参考にしたページの通り。SDK Platform Tools、ファクトリーイメージ、パッチをそれぞれダウンロードし解凍。同じフォルダへ突っ込んで、コマンドプロンプトブートローダーアンロックとイメージ書き込みを行います。(fastboot.exeにパス通すの面倒なので)

使用したのは下記のもの。

SDK Platform Tools Release Notes | Android Studio

※パソコンはWin10なのでWindows用をダウンロード。最新版だった「26.0.1 (September 2017)」を使用。

Factory Images for Nexus and Pixel Devices  |  Google APIs for Android  |  Google Developers

※ファクトリーイメージ。「"bullhead" for Nexus 5X」にある「8.0.0 (OPR4.170623.009, Oct 2017)」を使用。

Nexus 5X bootloop of death fix (BLOD) | 7/30… | LG Nexus 5X

※「Boot.img from Android O DP6」を使用。

 

ファクトリーイメージ書き込みからやったけど、もしかしたら最後の対策済みブートイメージだけ書き込めば良かったのかも?元々8.0.0入ってたので(未検証)

vendor.img書き込み後にブートローダー再起動してから対策済みboot書き込むと上手くいかなかったので、vendor.img書き込み後続けて対策済みbootを書き込んだら上手く行きました。慣れている人にとっては当たり前なんですかね?良く分かりません。

当たり前ですが、データは完全に消えて初期状態になります。可能であればバックアップとるなど事前準備しておくと後が楽です。ある程度はGoogleさんが勝手にバックアップしてますが、LINEとかは面倒なので。("fastboot format userdata"実行しなければ大丈夫なのかな?未検証)

対策されたboot.imgは使用するCPUコアを制限するもので、big側の1.8GHzデュアルコアを使わないようにします。残りのLITTLE側1.4GHzクアッドコアだけで動くようになるため、高負荷時のパフォーマンスが落ちるらしいです。私の場合は体感できなかったので支障ありませんでしたけど。

ブートローダーのアンロック以外は手順通りなので思ったより楽でした。常にアンロックしておいた方がいいのかは悩ましいところです。

まだ1日しか経過していないので、症状再発したら追記します。

 

(2017/10/26追記)

2日経過し、問題ありませんでした。が、試しに再起動したら起動しなくなりました。"fastboot flash boot 4CoreOreo.img"したらまた動くようになりました。その後は再起動しても電源落としてもちゃんと起動するようになってます。ちゃんと書き込めてなかったのかな?データも残ってるので一安心です。ちなみに、USBデバッグはオフのままで問題ありませんでした。

(2017/11/9追記)

11月パッチがOTAであったので、ダメ元で適用したらブートループ再発しました。

前回と同じファクトリーイメージ焼いたり新しいの焼いたり古いの焼いたりしても状況変わらず。リカバリーモードも相変わらず起動しないので手詰まりな感じに。なんとなく"fastboot oem lock"したら端末に確認画面出たのですが、ボタン押し間違えてキャンセル選んだら起動しました。でも再起動するとまた同じ状況になる。そしてまたoemロック→キャンセルすると起動する。起動するとシステムアップデートの通知出るし、OTAアップデート時のゴミが残ってて更新の続きをするためのブートモードになっているのかなーと推測。まずはゴミ掃除のため「Googleサービスフレームワーク」のデータを削除し開発者フレームワークの通知をOff/On。(データ削除は副作用あるらしいのでご注意を)

この状態で最新のファクトリーイメージをflash-all.batで適用したところ、droid君が倒れてる画面になり何も操作できず。文鎮覚悟しましたが、再起動したらGoogleロゴの次の画面まで行ってフリーズ→リブートしたので、パッチ当てたら("fastboot flash boot 4CoreOreo.img")起動するようになり、再起動でも問題なくなりました。ヽ(=´▽`=)ノ

楽しいけど心臓に悪いです。端末がダメになるのが先かUSBケーブルがダメになるのが先かの勝負みたいにもなってたりして。

教訓:OTAアップデートはダメ絶対。

メモ:開発者オプションでシステム自動アップデートを無効に。設定のシステムアップデートは触らない。

(2017/12/11追記)

端末がフリーズし、自動的に再起動した。その日のうちに何度か発生し、だんだんとOS起動が完了しなくなり、しまいにはブート画面さえ出なくなった。電源入れても赤ランプが点くだけになり、完全にお亡くなりになった模様。

amavisd-newとSophos Antivirus for Linuxでメールチェックにてハマったのでメモ

Ubuntu 16.04 LTSにPostfixでメールサーバー建ててます。amavisd-newをコンテンツフィルターとして使い、配下で定番のclamavspamassassinを動かしてました。

しかしながら、clamavの検出力が残念な感じだったので、Sophos Antivirus for Linuxを試してみることにしました。無料版ということでsweepによるオンデマンドスキャンしかできませんが、検出力は満足いくものでした。(セカンダリの位置付けなので、プライマリのclamavを停止して検証など行いました。)

問題なく数ヶ月たった11月中頃、パッタリと検出しなくなりました。時々思い出したように原因を探ってたんですが、ようやく対処方法が分かったのでメモしておきます。

※覚えてないだけで、色々設定を弄っていた可能性もあるため、万人に通用する対処ではないかもしれません。よって、自分用のメモの位置付けとします。まとまっていませんがご容赦ください。

 

まずはログの調査。

# /opt/sophos-av/bin/savlog --today

→エラーなど見当たらず、定期的な更新もされているように見える

マルウェアのzipファイルをWindows機からscpして、sweepを手で叩いて検出するか確認してみる。

# sweep hogehoge.zip

→ちゃんと検出した

一応、ウィルス定義ファイルがちゃんと更新されているか確認。

# ls -lrt /opt/sophos-av/lib/sav

→新しいファイルが存在する

# /opt/sophos-av/bin/savdstatus --version

Copyright 1989-2016 Sophos Limited. All rights reserved.
Sophos Anti-Virus = 9.12.3
ビルドのリビジョン = 2629392
脅威検出エンジン = 3.65.2
脅威データ = 5.34
検出脅威数 = 12413311
脅威データリリース日 = 2016年11月29日 00時00分00秒
前回アップデートを確認した日時 = 2016年12月13日 12時25分39秒

→脅威データリリース日が古いのが気になるけど、バージョンは問題無さそう

# ps aux | grep amavis

amavis 56768 0.0 6.2 259336 126976 ? Ss 18:34 0:01 /usr/sbin/amavisd-new (master)
amavis 58661 0.3 6.5 267272 134352 ? S 19:18 0:02 /usr/sbin/amavisd-new (ch5-avail)
amavis 58684 0.3 6.6 266712 135012 ? S 19:19 0:02 /usr/sbin/amavisd-new (ch5-58684-05)
postfix 58816 0.0 0.4 100864 10140 ? S 19:23 0:00 smtpd -n xxx.xxx.xxx.xxx:smtp -t inet -u -o stress= -o content_filter=smtp-amavis:[127.0.0.1]:10024 -o receive_override_options=no_address_mappings
postfix 59154 0.0 0.2 83136 5956 ? S 19:29 0:00 smtp -n smtp-amavis -t unix -u -o smtp_data_done_timeout=1200 -o smtp_send_xforward_command=yes -o disable_dns_lookups=yes -o max_use=20
sophosav 59178 1.0 0.2 75632 4360 ? S 19:30 0:00 /usr/local/bin/sweep -nb -f -all -rec -ss -sc -archive -cab -mime -oe -tnef --no-reset-atime /var/lib/amavis/tmp/amavis-20161213T192054-58684-12pnURVQ/parts
amavis 59181 79.0 4.3 162584 88128 ? Sl 19:30 0:02 savscan -nb -f -all -rec ss -sc -archive -cab -mime -oe -tnef --no-reset-atime /var/lib/amavis/tmp/amavis-20161213T192054-58684-12pnURVQ/parts
root 59184 0.0 0.0 16216 932 pts/1 S+ 19:30 0:00 grep --color=auto amavis

→sweepがsophosavユーザーで動いてる。savscanはamavisユーザーで動いてる。よく分からん。sophosavユーザーだと対象のファイルを読めないので、とりあえずそれぞれのグループにユーザーを追加してみる。

# gpasswd -a sophosav amavis

# gpasswd -a amavis sophosav

→結果変わらず。

※上のps結果で、savscanの方、なぜかssオプション前のハイフンが消えている。気になって調べたけど原因不明。ナニコレ?

savのログではスキャンしたことになっているけど実際のところどうなんだ、ということで、テンポラリに作られるファイルをタイミングよくコピーして手動スキャンしてみたらちゃんと検出された。ログにも残る。謎が深まる。

Postfixのコンテンツフィルターは外から来たメールしか通していなかったので、ローカルからテストできるようにmaster.cfを編集し、10026ポートでの待受けを追加。

# vi /etc/postfix/master.cf

(下記追加。環境に合わせて読み替え必要かも)

192.168.0.1:10026 inet n - - - - smtpd
 -o content_filter=smtp-amavis:[127.0.0.1]:10024
 -o receive_override_options=no_address_mappings
 -o smtpd_client_restrictions=permit_mynetworks,reject

再起動して、メーラーの設定を10026ポートを使うよう変更。これでガシガシ試せる。早速マルウェア付きメールを送信してみる。

→見事にスルーされる。だめじゃん。

ローカルから送ったメールはコンテンツフィルター内でスルーしているのかも、と思いamavisの設定を弄くりつつ試行錯誤したが、そういう問題ではなさそう。(@bypass_virus_checks_maps、@whitelist_sender_aclを変更してみたり)

最終的に辿り着いた対処はコレ。

# vi /etc/amavis/conf.d/20-debian_default

@keep_decoded_original_maps = (new_RE(
# qr'^MAIL$', # retain full original message for virus checking (can be slow)
   qr'^MAIL-UNDECIPHERABLE$', # recheck full mail if it contains undecipherables
   qr'^(ASCII(?! cpio)|text|uuencoded|xxencoded|binhex)'i,
# qr'^Zip archive data', # don't trust Archive::Zip
));

→Zipの行のコメント外して有効に。

これでちゃんと検出するようになりました。(これデフォルトのはずなんだけども。)

未検証ですが、sweepに渡しているmimeオプションを無効にしても同様の結果になるかもしれません。というか、むしろそっちのほうが良い気がします。これだとZIPは生で渡してますが、その他の形式の場合デコードして渡しちゃうし、他のアンチウィルスソフトとの共存も考えなくちゃならないし。他形式のサンプルないので検証出来ませんけど、対応出来たので良しとしておきます。

Ubuntuのセキュリティアップデートで更新されたパッケージとか影響してるのかなぁ。mime-supportとか。(適当))