暫定 - 技術メモなど

今のところはRaspberry Piを使ったIoTが話題の中心です

パスワードの作り方

今、ネット上で話題となっていることがある。
宅ふぁいる便の個人情報漏えい事件である。

piyolog.hatenadiary.jp
www.fnn.jp

このような情報漏えい事件では、様々な反応が見られる。不服を唱える者、煽る者、揚げ足を取って悦に入る者、まったく意に介さない者。今回はネット上の反応は概ね、ログインパスワードが平文で保存されていたことに対する批判であるように見受けられる。その中でも特に、一つのパスワードを複数のサービスで使用していたユーザーからの批判は怒りの度合いが高いようだ。他のサービスでも同じID・パスワードを使用している以上、乗っ取りを避けるには、他のサービスのパスワードを全て変更する必要があるからだろう。
筆者の反応はというと、サービス利用者ではあるが、意に介さない、に近い。なぜかと言えば、パスワードが漏れたところでなんの問題もないからである。

一つのパスワードを複数のサイトで使用することの危険性は何年も前から指摘されている。指摘していた本人からすれば「だから言っただろう」といったところに違いない。だがしかし、一般的にパスワードを複数使い分けるのが至難の技であることもまた事実である。

宅ふぁいる便のサービスとしての問題を論うことも一つの「立派な意見」ではあると思うが、後ろを向き続けていてもしかたがない。このブログは少しでも誰かの役に立つことを願って始めたものである。今回のエントリーもそうであってほしいという思いを込め、今更ではあるが、複数のサイトで使える(と私が考える)「パスワードの作り方」を提示したいと思う。

1.サービスの重要度を考える

あなたが何かのインターネット上のサービスを使用したい、と思ったとする。最近ではアカウントを作らずに使用できるサービスはまず希で、サービス提供側もあの手この手でアカウントを作らせようとするものだ。
アカウントにはパスワードがつきものである。そして、このパスワードこそが曲者なのである。

パスワードを設定する前に、ちょっと考えてみてほしい。目の前のサービスは自分にとってどれくらいの重要度を持つか。仮にアカウントを乗っ取られた場合、このサービスは自分の生活を脅かすだろうか。
簡単な判断材料は金銭が絡むか絡まないか、である。
その判定基準で言えば、銀行や証券会社はSランクと言える。もちろん、乗っ取られた場合、どれだけ買い物されるかわからないような楽天やアマゾンもSランクだと思っていい。
直接金銭には絡まないものの、信用問題に発展しそうなメールやSNSはAランクくらいだろうか。
一方、乗っ取られてもさして生活を脅かしそうにないサービスの場合はB〜Dランクを設定する。宅ふぁいる便は筆者にとってはCランクに相当する。多少信用問題には関わるが、第三者にファイルを送信されても直接の被害はないし、ファイルを送信した通知が自分自身に届くので、気づく機会はあるからだ。
そして、目の前のサービスにランクをつけ終えたらS〜Aと、B〜Dを明確に分ける。真剣に考えなくてはならないのはランクA以上のサービスだ。B以下のサービスには使い回しのパスワードを設定しても構わない。私はこのルールを「しょうもないサービスにはしょうもないパスワード」と呼んでいる。それくらいの気楽さは必要だ。

2.真剣に考えるべきパスワードをどうするか

では、本気で守らなくてはならないAランク以上のパスワードをどう考え、また、複数のサイトでそれぞれ違うパスワードを設定するにはどうすればよいか。
まず、よいパスワードとは何か考えてみよう。思いつくのは以下の3つだ。

  1. いつでも思い出せること
  2. 他人には想像もできないこと
  3. サービスごとのパスワードであること

上記を満たすことは通常困難だ。だから人は一つのパスワードを使い回さなければならなくなるのだ。
更に、各サイトが定めるパスワードポリシー(数字、記号、アルファベットの大文字を含む必要がある等)を満たす必要もあるので、より困難さを増すことだろう。

2-1.言葉を考える

困難に立ち向かう為に、まずはパスワードのコアになる言葉を考えよう。
これは辞書から持ってきてもいいし、思いつくもので構わない。但し、すぐ思い出せること、複数であることが必要だ。また、複数の言葉が並んで意味を成すことも避けた方がいいだろう。
cuticle mumbai はいいが、 red square は避けた方がよいだろう。また、3語以上にすると複雑さが増してより強固になる。

2-2.言葉に数字や記号を付与する

コアとなる言葉を決めたら、次にこの言葉を加工しよう。簡単に言えば、単語の間に数字や記号を付与するのである。red square を例にして説明すると、

red1@square

とする。上の例では1@を付与した。
一応説明しておくと、ひと昔前では1語の英単語をパスワードとして用いる場合、lを1に、aを@、oを0に置き換えることが流行った時期がある。例えば password を p@ssw0rd と読み替えることを指すが、今ではまったくお勧めできないことを断っておく。攻撃者の総当たり辞書に予め登録されているからだ。

2-3.サービスごとの固有情報を付与する

サイトごとに違うパスワードを設定するにはここからが正念場だ。自分でルールを考える必要がある。
サイト、もしくはサービス提供者の情報をパスワードに組み込むのだ。簡単に思いつくのは最初と最後にサイトのURLの一部を付与する方法だ。例えば、 abc.def.com というサイトのサービスを使用するとする。この情報を2-2で決めたパスワードに組み込む。

ared1@squref

上記の例では、URLの情報をわかりやすく最初と最後に持ってきた。もちろん単語の途中に組み込んでもいいだろう。
これで最初よりも複雑性を増すことができる。しかも、サイトのURLを見れば、たちまちパスワードを復元することが可能だ。
但し、これではまだ弱い。この中に自分の思い出しやすい数字(例えば家の電話番号の一部でもよい)を更に加える。

0ared1@squref6

最近のサービスではパスワードは8〜16文字、数字・記号を含む必要があることが条件となっていることが多いが、上記であれば満たすことができるだろう。更に、アルファベットの大文字も含むことを求められる場合があるが、その場合、大文字にする文字を決めておけばよいだろう。

0aRed1@squRef6

上記の例では「Rは必ず大文字にする」というルールを適用している。
これで、2.他人には想像もできない 3.サービスごとのパスワードであるが、1.いつでも思い出せる、という3つの条件を満たし、かつ大抵のパスワードポリシーも満たすことができるだろう。このルールを発展させ、最初に決めた言葉を組み替えたり、記号を足したり、もっと複雑にすることもできる。

****

この先、ネット上のサービスはますます増加するだろう。そして、使用するサービスが増えるに従い、個人情報の漏えいはますます増えていくと思う。企業は情報の漏えいを前提にして、なるべく個人情報を持たないサービスを設計する必要が出てくるだろうが、サービスを受ける側にもできることがあるということを知ってほしい。漏えいを前提にして準備をしなくてはならない時代が来ている。かと言って、いつも気を張ってサービスを受けるなんてまっぴらごめんだ。
だからこそ「しょうもないサービスにはしょうもないパスワード」を。

・・・などと色々書いたが、面倒な人はパスワード管理ツールの使用を検討してほしい。年間数千円でサイトごとの強固なパスワード生成から管理までお任せできて、この面倒な問題を丸投げできるのだから安いものだと思う。
パスワード管理ツールを選ぶポイントを一つ挙げるならば、データをエクスポートできること、この一点である。選んだパスワード管理ツールに問題があった場合や改悪された場合、他所に引っ越しやすいことが重要となる。
しかし、パスワード管理ツールを使い始めるにあたっても、まずパスワードを設定する必要があり、言うまでもなくパスワード管理ツールはSランクのサービスだ。
本当に世知辛い世の中である。
その際にも本エントリーを参考にしてパスワードを決めて頂けると幸いである。

BME280をhomebridgeに載せてホームアプリに温度・湿度を表示させる

f:id:yrn7:20181117202238p:plain
Raspberry Piを購入して、homebridgeを実装した当初から、温度・湿度もホームアプリに表示できるようにしたいな、と考えていました。
通常、ホームアプリに部屋の温度と湿度を表示させようと思うと、homekitに対応したElgatoなどの製品を購入するのが簡単でしょう。
https://amzn.to/2rrtWZT


手元にRaspberry Piがあること、センサーを単品で買う方が安いことから、homebridgeでセンサーの表示をすることを目指し、うまくいかなかったときはまたその時に考えよう、という方針を固めました。

用意したパーツやワイヤは下記のとおりです。

  • BME280搭載 温湿度・気圧センサモジュール( https://amzn.to/2FMP3A9 )
  • ブレッドボード
  • ブレッドボード用ジャンパワイヤ
  • Raspberry Piとブレッドボード接続用ジャンパワイヤ

また、今回参考にさせていただいたサイトは下記のとおりです。
qiita.com
karaage.hatenadiary.jp
www.instructables.com

1.センサーとRaspberry Piを配線する

まずは上記のセンサーをブレッドボードに配置し、ワイヤでRaspberry Piと接続します。
(その前にBME280のピンヘッダを半田付けする必要があります。半田ごてがない場合や、半田付けが苦手な人向けに半田付け済みの製品もあります。 https://amzn.to/2G4MXf1 )
接続は参考先のサイトに従い、下記のように接続しました。
f:id:yrn7:20181117190414p:plain

2.センサーの値を取得できるように設定する

I2Cを有効にするため、raspi-configを実行します。

$ sudo raspi-config

メニューから"5 Interfacing Options"を選択し、"P5 I2C"で Enable にします。
Enable にしたら必要なツールをインストールします。

$ sudo apt-get install i2c-tools
$ sudo apt-get install python-smbus 

1.で接続したセンサーの確認をします。

$ sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- 76 --

上記のように 0x76 になっていれば問題ありません。上記のように表示されない場合は接続を確認してください。

3.センサーの動作確認

今回の使ったBME280の販売元のスイッチサイエンスさんがサンプルのPythonコードを作ってくれているので、適当なディレクトリにダウンロードします。

$ mkdir ~/python_apps/switchsience
$ cd !$
$ wget https://raw.githubusercontent.com/SWITCHSCIENCE/BME280/master/Python27/bme280_sample.py

サンプルコードを実行してセンサーの動作確認をします。

$ chmod 755 bme280_sample.py
$ sudo python bme280_sample.py
temp : 20.47  ℃
pressure : 1016.69 hPa
hum :  64.87 %

温度、気圧、湿度が湿度が取得できました。

4.homebridgeの設定

homebridgeを起動しているユーザーをi2cグループに追加します。

$ usermod -aG i2c [ユーザー名]

本ブログの通り設定している場合、ユーザー名は homebridge になります。
yorino.hatenablog.com

BME280用のhomebridgeプラグインをインストールします。

$ sudo npm install -g homebridge-bme280 --unsafe-perm

エラーが出た場合は下記を実行します。

$ sudo su -
$ npm install -g homebridge-bme280 --unsafe-perm

プラグインをインストールしたら、configファイルを編集します。

$ sudo vim /var/homebridge/config.json

{
    "bridge": {
        "name": "Homebridge",
        "username": "xx:xx:xx:xx:xx:xx", 
        "port": 51826,
        "pin": "031-45-154"
    },
    "accessories": [
    	{
・
・
・
        },
        {
            "accessory": "BME280",
            "name": "Sensor",
            "name_temperature": "Temperature",
            "name_humidity": "Humidity",
            "options": {
                "i2cBusNo": 1,
                "i2cAddress": "0x76"
            }
        }
    ]
}

homebridgeを再起動します。

$ sudo systemctl restart homebridge

iPhoneのホームアプリに温度と湿度が表示されていることを確認します。
※ホームアプリでは気圧は表示されません。

設定は以上です。
お疲れ様でした。

iPhoneのウィジェットにショートカットを登録して一発でWi-Fiオフする

iOS11から、コントロールセンターを使ってWi-Fiを完全にオフすることができなくなりました。完全にオフしたい場合、[設定]からわざわざオフしなくてはならず、これはiOSの改悪だな、と思っていました。
iOS12になってもこの仕様は変わらず、アップルはずっとこのまま行くのだな、と思っていましたが、ふとショートカットアプリでWi-Fiを完全オフできるのではないか、と思ったら実際できました。そして、ウィジェット(ロック画面やホーム画面の右スワイプで表示される画面)に登録することで、コントロールセンターと同じくらい使い勝手がよくなりましたので、今日はそちらの話題を取り上げたいと思います。

参考サイトはこちらになります。
mobilelaby.com

参考サイトと言いますか、この通りやればまったく問題ありません。
(iOS11を使用している際、まだworkflowの名前で提供されていたときから使っていましたが、そのときからこの手順でWi-Fiオフできていたかは不明です)

まずはiOS12にアップデート後、App Storeでショートカットをダウンロードします。f:id:yrn7:20180926122930p:plain

その後、設定を行います。
起動して[ショートカットの作成]をタップし、検索窓に「Wi-Fi」と入力して[Wi-Fiを設定]をタップします。
f:id:yrn7:20180926122954p:plain

そのあと出てきた画面で[Wi-Fi]を無効にして、右上にコントロールセンター風のアイコンをタップ、名前をつけてアイコンを変更します。[ウィジェットに表示]をオンするのをお忘れなく。
必要に応じて[Siriに追加][ホーム画面に追加]を行なってください。
あとは[完了]を二回タップして閉じます。

ウィジェットを見ると設定した項目が表示されます。
f:id:yrn7:20180926123026p:plain
ウィジェットを開いて、一番下に表示される[編集]からショートカットを追加し、適宜順番を変更しましょう。

ショートカットにはホームアプリのシーンの登録も可能で、ウィジェットに表示するととても便利です。
また、先人が生み出した便利なショートカットがギャラリーに登録されていて、それらをすぐに使用することもできます。

ちなみに、今回のiOS12はhomebridgeに対して不具合は起こしていないようで、快適に使えています。

PowerShellを使用した文字列抽出と置換について

テキストファイルからある文字列を抽出したいことがよくあります。
通常であれば grep を使用するのがお手軽ではありますが、今回は一般ユーザー向けに手順を用意する必要があり、一般ユーザーが使用しているWindows PCには当然 grep が導入されていません。

Windowsの場合、よくある例では find が使用されます。しかし時は2018年も後半、いまどきバッチではなくPowerShellだろう、ということでPowerShellを使用しました。

今回はPowerShellを使用して文字列を抽出した際、UNIXコマンドとは違う結果になり結構手こずったので、必要となった文字列置換も含めてのメモとなります。

今回の参考サイトは下記になります。
tech.sanwasystem.com
mtgpowershell.blogspot.com
news.mynavi.jp

1.PowerShellを使った文字列抽出

PowerShellの場合、 Select-String を使用します。

Get-Content 抽出元ファイル名 | Select-String "抽出したい文字列" > 抽出先ファイル名

上記のダブルクォーテーションは念の為つけておきましょう。
(空白が含まれる場合があるので)

私の場合は時間経過ごとに抽出先ファイルを新しく作る方が有利だったので、日時分がファイル名につくように変数を使いました。

$filedate = Get-Date -Format "yyMMdd_hhmm"
Get-Content 抽出元ファイル名 | Select-String "抽出したい文字列" > $filedate-抽出先ファイル名1

当初、一般ユーザー向けに手順起こしをする前は Cygwingrep を使用していました。PowerShellでもまずまず同じような結果になったのですが、grepを使うとタブになっていた箇所が、PowerShellでは半角スペース3つに変わって出力されていました。
これは次の処理では困ったことになるので、置換についても対処しました。

2.PowerShellを使った文字列置換

前述のとおり、半角スペース3つのタブへの変換という、実に地味な変換の為、以下のようにしました。

$encoding = [Text.Encoding]::default 
$sr = new-Object IO.StreamReader((Convert-Path "$filedate-抽出先ファイル名1"),$encoding) 
$text = $sr.Readtoend()
$sr.close()
$text -replace '   ',"`t" > 抽出先ファイル名2

というわけで、最終的なスクリプトはつなげて下記のようになりました。これを拡張子 ps1 として適当なファイル名で保存すればOKです。

$filedate = Get-Date -Format "yyMMdd_hhmm"
Get-Content 抽出元ファイル名 | Select-String "抽出したい文字列" > $filedate-抽出先ファイル名1
$encoding = [Text.Encoding]::default 
$sr = new-Object IO.StreamReader((Convert-Path "$filedate-抽出先ファイル名1"),$encoding) 
$text = $sr.Readtoend()
$sr.close()
$text -replace '   ',"`t" > 抽出先ファイル名2

おしまい。

macOS High SierraでFritzingのファイルを保存できなかった場合の対処

Raspberry Pi で homebridge を運用していて、いくつかブログのネタにもしてきましたが、まだ書いていないことがあります。GPIOに接続している温度・湿度センサーの情報をホームアプリに表示する方法です。この方法を記事に書こうと思うと配線図を作らなくてはいけないのですが、これが手間取りそうでずっと避けてきました。

とうとう重い腰を上げて、配線図の作成から行おうと思い、回路図や配線図作成で名高い Fritzing をインストールしましたが、起動時にファイルが見つからないというメッセージが出たのと、ファイルの保存ができない現象が発生してしまいました。
解決できたのですが、そこで力尽きたので、今日のところはその解決方法をメモとして残しておきます。

なお、当方の環境は下記のとおりです。

また、インストールした Fritzing のバージョンは0.9.3bです。

1.現象

公式サイトからダウンロードし、インストールを行います。

http://fritzing.org/download/

インストール後、起動しようとすると下記のメッセージが表示されました。

Unable to find the following 4 part(s):
‘generic_shrouded_pin_header_10_100mil' at 'parts/core/generic_shrouded_pin_header_10_100mil.fzp'
‘generic_female_pin_header_2_100mil' at 'parts/core/generic_female_pin_header_2_100mil.fzp'
‘mystery_part_sip_3_100mil' at 'parts/core/mystery_part_3.fzp'
‘generic_ic_dip_8_300mil' at 'parts/core/generic_ic_dip_8_300mil.fzp'

「パーツが見つからない」とは出るものの、起動はするのでそのまま進めます。
ファイルを作成して保存しようとすると下記のメッセージが表示され、保存ができませんでした。

Cannot write file temp:
/Users/<username>/.config/Fritzing/e4b07472b1fc5c5c78833dfdf8040360/temp.xml
/Users/<username>/.config/Fritzing/e4b07472b1fc5c5c78833dfdf8040360/Untitled Sketch.fz
Permission denied.
2.解決法

保存時に出てきたメッセージがヒントになって解決できました。(Permission denied)
インストールした Fritzing をアンインストールし、下記のコマンドを実行します。

$ sudo rm -rf ~/.config/Fritzing/
$ sudo chmod 777 ~/.config/

その後、もう一度 Fritzing をインストールします。これで無事 Fritzing でファイルを保存することができ、起動時にもメッセージが表示されなくなりました。

どれだけの需要があるか分かりませんが、配線図ができたらいよいよ温度・湿度センサーのホームアプリ表示の記事を書こうと思います。

rpi-cloneバックアップイメージ書き出し不具合の対処について

普段、Raspberry Piのバックアップを取るときにはrpi-cloneを使っています。

github.com

このツールはとても便利で、接続しているUSBメモリに対話式でバックアップを取ってくれます。ぼくの場合は、ブートに使っているmicroSDと同じ16GBのmicroSDをUSBのアダプタに入れて、バックアップ先にしています。Raspberry Piに何か問題が起きた場合、バックアップ先になっているmicroSDと差し替えればそのままブートできるので、システム変更前のロールバック準備として重宝しています。

rpi-clone自体は何の問題もなく動いているのですが、バックアップ先のmicroSDをイメージとしてMacに残す際に問題が発生しました。
ddコマンドでイメージを取っているのですが、15GBあるはずのデータが300MBで保存されるようになってしまったのです。当然のことながら、そのイメージをmicroSDに書き戻してもブートしません。
原因を調べたのですが、このような症例は見つからず、困り果てていたのですが
(現に、作業前に取得したバックアップより一つ前に戻したかったのに、バックアップファイルが有効ではない、ということがありました)
Raspberry Piでイメージにして、それをMacに移せばいいではないか、と思い至りました。
方法としては下記の流れになります。

  1. rpi-cloneでmicroSDにバックアップ
  2. イメージ書き出し先のUSBメモリの準備
  3. バックアップのイメージをUSBメモリに書き出す
  4. Macにバックアップ

試してみたところこれで解決しましたので、メモとして残しておきたい思います。

続きを読む

Google Home Miniでの家電コントロールとiPhoneの呼び出し

homebridgeとIRKitの組み合わせ、Philips Hue、Koogeekのおかげで、多くの家電をiPhoneでコントロールできるようになりました。
操作はほぼホームアプリを使用しているのでさほど気にはならなかったのですが、私の滑舌の悪さでしょうか、音声コントロールをしようとするとSiriが反応してくれないこともままあり、音声コントロールに不便さを感じることがありました。
試しにGoogle Home Miniを導入してみると、聞き取りの間違いもあまりなく、音声コントロールが非常に快適になりましたので、今回はその話題を取り上げてみたいと思います。

続きを読む