FirefoxとWebExtensionとExtensionIDと。

はじめに

FirefoxのWebExtensionとNativeMessagingHostで通信をしようとしていまいちうまくいかなくていろいろ触ってみました。

まずは結論

ExtensionIDの確認がしたければ、とりあえず

console.log(chrome.runtime.id)

で吐かせましょう。

どうやってExtensionIDは決まるのか。

 "applications": {
     "gecko": {
         "id": "/^([a-z0-9-._]*@[a-z0-9-._]+|\{[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]
 {12}-\})$/i"
     }
 }

f:id:paihu:20170906222440p:plain

  • 署名済みなら addons.firefox.com の署名ページ f:id:paihu:20170906224651p:plain

  • 未署名をabout:debugging 経由で読み込んだら

毎回変わる [a-f0-9]+@temporary-addon というもの
これは、 chrome.runtime.id を表示させないとわからない気がします。
内部UUIDとは関係なさそう。

開発中どうすれば

素直に manifest.jsonに書くのがよさそうな気がします。

でも、これ書くとクロスブラウザ的な開発したいとき、 chromeに読み込ませると警告が出るのがいやらしい。。

とはいえ、開発中くらいID固定しないととってもつらいです。

CentOS7にISC Kea インストールする

メモだけ

インストール

yum -y install epel-release
yum -y install gcc gcc-c++ boost-devel flex
yum -y install log4cplus-devel botan-devel
yum -y install mysql-devel postgresql-devel
curl -L http://ftp.isc.org/isc/kea/1.2.0/kea-1.2.0.tar.gz -o kea-1.2.0.tar.gz
tar axf kea-1.2.0.tar.gz
cd kea-1.2.0
./configure --with-dhcp-mysql --with-dhcp-pgsql --enable-shell --prefix=/opt/kea
make install
ldconfig

DB初期化(mariadb)

# yum -y install mariadb-server
# systemctl start mariadb
# mysqladmin -u root password 'root'
# mysql -u root -p
password: ****
mysql> create user 'kea'@'localhost' IDENTIFIED BY 'kea';
mysql> create database 'kea';
mysql> grant all on kea.* to 'kea';
mysql> exit;
# kea-admin  lease-init mysql -u kea -p kea -n kea

設定(databaseにMariadbを指定)

    "lease-database": {
        "type": "mysql",
        "name": "kea",
        "user": "kea",
        "password": "kea",
        "host": "localhost",
        "port": 3306
    },
     "hosts-database": {
         "type": "mysql",
         "name": "kea",
         "user": "kea",
         "password": "kea",
         "host": "localhost",
         "port": 3306
     },

データベースの内部については http://kea.isc.org/wiki/HostReservationsHowTo ここを。

IPV4なら hosts に いわゆる固定IPアドレス払い出し用情報、 lease4 に 払い出したIPv4 情報 が載ってます。

select (HEX(hwaddr)),(HEX(address)) from lease4;

とかでリースしているIPAddresとMacAddressの組み合わせが見られますね。

ログとれた

OSQuery で process_eventsをゲットしようとしてみたところ、どうもうまくいってない。

具体的には、audit.logにはどんどんログたまってるのに select * from process_events; しても1件も取れず。 osqueryd 動かしていても result.logが全く記録されない感じ。

環境

Process

[vagrant@localhost ~]$ ps aux | grep osquer[y]
root     18816  0.0  1.7 217572  8516 ?        SNsl 01:41   0:00 /usr/bin/osqueryd --flagfile /etc/osquery/osquery.flags --config_path /etc/osquery/osquery.conf
root     18819  0.0  1.8 357320  9432 ?        SNl  01:41   0:00 osqueryd: worker

config

[vagrant@localhost ~]$ cat /etc/osquery/osquery.conf
{
  "schedule": {
    "process_events": {
      "query": "select * from process_events;",
      "interval": 60
    },
    "user_events": {
      "query": "select * from user_events;",
      "interval": 60
    }
  }
}

flag

[vagrant@localhost ~]$ cat /etc/osquery/osquery.flags
--disable_events=false
--disable_audit=false
--audit_allow_config=true
--audit_persist=true

INFO

[vagrant@localhost ~]$ cat /var/log/osquery/osqueryd.INFO
Log file created at: 2017/08/07 01:41:22
Running on machine: localhost.localdomain
Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msg
I0807 01:41:22.665422 18819 events.cpp:824] Event publisher failed setup: kernel: Cannot access /dev/osquery
I0807 01:41:22.665441 18819 events.cpp:824] Event publisher failed setup: syslog: Publisher disabled via configuration

追記

よくわからないけれど、再起動で拾えるようになった。

FileBeats Auditd module

Audit log をいい感じにParseするやつとして、 FileBeatsに Auditd module あるし、今ならきっとそれ使ってると思う。

というような発表をBuildersCon 2017 で聞いてきたのですが、前に触ったとき、いい感じに扱えなかった記憶があったので、再度見てみました。

Auditd module

まずダッシュボードを見ると、SYSCALL PATH CWD EXECVE が分かれているパイチャートが見える、この時点で すでにつらそう。

実際にログ吐き出させてみると、やはり行指向に、audit.log 1行が1レコードとして吐き出されるので、 何か検索した後、 msg=audit(xxxx.xxx:yyyy) みたいなところのyyyyが一致するもの…… として調べて回らないといけない感じです。

{"@timestamp":"2017-08-06T05:18:54.062Z","beat":{"hostname":"localhost.localdomain","name":"localhost.localdomain","version":"5.5.1"},"input_type":"log","message":"type=SYSCALL msg=audit(1501996733.927:1232): arch=c000003e syscall=59 success=yes exit=0 0=26bcb40 a1=26b0220 a2=26afad0 a3=7fff295001e0 items=2 ppid=809 pid=68498 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 comm=\"sleep\" exe=\"/usr/bin/sleep\" ubj=system_u:system_r:ksmtuned_t:s0 key=(null)","offset":993081,"source":"/var/log/audit/audit.log","type":"log"}
{"@timestamp":"2017-08-06T05:18:54.062Z","beat":{"hostname":"localhost.localdomain","name":"localhost.localdomain","version":"5.5.1"},"input_type":"log","message":"type=EXECVE msg=audit(1501996733.927:1232): argc=2 a0=\"sleep\" a1=\"60\"","offset":993151,"source":"/var/log/audit/audit.log","type":"log"}
{"@timestamp":"2017-08-06T05:18:54.062Z","beat":{"hostname":"localhost.localdomain","name":"localhost.localdomain","version":"5.5.1"},"input_type":"log","message":"type=CWD msg=audit(1501996733.927:1232):  cwd=\"/\"","offset":993201,"source":"/var/log/audit/audit.log","type":"log"}
{"@timestamp":"2017-08-06T05:18:54.062Z","beat":{"hostname":"localhost.localdomain","name":"localhost.localdomain","version":"5.5.1"},"input_type":"log","message":"type=PATH msg=audit(1501996733.927:1232): item=0 name=\"/usr/bin/sleep\" inode=34113796 dev=08:03 mode=0100755 ouid=0 ogid=0 rdev=00:00 obj=system_u:object_r:bin_t:s0 objtype=NORMAL","offset":993381,"source":"/var/log/audit/audit.log","type":"log"}

いや、それが面倒だから1レコードにしてほしいんだけど。。

状態です。

やっぱり OSQuery がよさげなんですかね

BuildersCon 2017 へ行ってきた。

前夜祭

大人のBuildersConということで、アルコールありの撤退シリーズでした。

どれもなるほどなぁ、と思いつつ聞いてました。

  • 良かれと思ってやったことが結果的に失敗することもある。
  • 当時はそうするのがまぁ普通だったけど、サービスが普通じゃなかったから方向転換した。
  • 要望に応えるべく内製してたけど、想像を超える使われ方をしちゃってつらかった。
  • 採用する際はちゃんとサポートが受けられる(意思の疎通とかも)ことはとても重要。

みたいな。

データセンターからの撤退

とあるサービスがデータセンターから撤退してクラウドに移行した話

データストアからの撤退

とあるサービス基盤がオレオレデータストアから撤退してMySQLに移行した話

PaaS完全撤退の歴史

とあるPaaSサービスが完全撤退した話。

ブロックストレージとの闘い

とあるサービスがとある大規模ブロックストレージから撤退してたくさんの中小規模ブロックストレージに移行した話。

初日

初めてのMySQLチューニング -データベースは怖くない!-

MySQLの基本的なチューニングとか、また向き合い方、姿勢みたいなことを話されてました。

知識としては人通り持っていますが、実際自分の手を動かして行うみたいな経験はないので いまいち感覚がわからないなーという感じでしたが、

怖いからって逃げていてはダメ。とか、きちんと向き合うためにはどうしていけばいいのか。

みたいなところはためになりました。

また、分かりやすいしゃべり方でよかったです。

真のコンポーネント粒度を求めて

HTML + CSS でのコンポーネント粒度はどうあるべきか、という話でした。

理想と現実のギャップをどうしていくのが良いか。みたいな話で、やっぱりその姿勢とかが参考になりました。

というのを紹介されていました。

前者は、設計・構築・運用まで含めて理想とする形はどうなのか。という内容。

後者は、現実的な運用を考えるとこうすべきだろう。というような内容。

実際はいろいろ折り合いをつけながらその中間点を探るのが良いのではないかというようなことをおっしゃっていました。

フレームなき道を拓くPHP

フレームワークを使わずになんかPHPでいい感じに作ろう。

みたいな内容だったのでしょうか。。

1日通して一番わかりにくい感じでした。PHPわかりません。

  • htmlspecialchars 使わないとXSSとか怖いよね、でも長いしつらいよね。
  • page.php?id=xxx とかいけてないよね、 /id/xxx みたいなのあこがれるよね、 Router どうよ。

という内容だったのかなぁと記憶してます。

Building high performance push notification server in Go

以前も聞いたことがあったGaurun の話。

特に新しいこともなく。

LT

  • QRコードは16分割とかできる
  • 電子工作とかおもしろいよ
  • Validation クッソつらい
  • Parser向け正規表現を作成する正規表現書いた
  • カンファレンスアプリを作った
  • Adがウザくてすまん、これから良くなるはず!
  • Scketch で Vueコンポーネント(内容わすれました)
  • バリアブル印刷すごい!画像取得結構つらい
  • scheme.org を JSON-LDで書くときれい!

懇親会

スタッフの方に、スタッフTシャツ着てると、話しかけてもあぁスタッフかって思ってもらえて割と気軽に話せる。一人でいるような人には積極的に話しかけていくようにしてる。 というようなことを伺い、なるほどなぁ、と思いました。

一人でいて話しかけられる方なので。

2日目

ここまで出来るmruby

mRubyはまだまだ若いので、今からでも頑張ってモジュール作るとみんなに使ってもらえるかも!

mRubyはCとか使って開発するし、低レイヤーに親しめる!

という感じでした。

小さく始めて育てるコンパイラ

難しかった。

  • 既存言語のサブセットとして動くものを作る
  • 欲しい機能を追加する
  • 構文を考える みたいな手順でオレオレ言語を作ると、割と作りやすいらしい。

既存言語なので、"動くものが作れること"は保証されているから、とりあえず作ってみるには適しているとか。

OSSで始めるセキュリティログ収集

Auditd のログを見やすくするのにOSQueryが良いよという話。

他にも go-audit や FileBeatsもあるらしく。

ちょうどAuditdのログを見やすくしたくて fluentdのmulti-line parserで無理やり何とかしようとしてたので すごく、いいタイミングでいい話がきけました。

OSQueryはいろいろできてすごく便利そう。

Factory Class

キーボードを作って世に出した人の話。

プロダクトを(たくさん)作るということについて。

工場選びとかいろいろ難しいらしい。

国によって文化とかも違うし、大変なんだろうなぁ……

The Evolution of PHP at Slack HQ

PHP は悪い言語だと言われているが、本当か?みたいな話。

SlackはPHPを使っている

と言っても 今は HHVM Hack に移行したっぽい。

感想とか

頑張って行った甲斐がありました。 自分がフロントエンドの人間ではないので、あんまりわかる話がない中、適当に面白そうな話をちょろちょろ聞きに行って、新しいものに出会えればなぁという気持ちだったので、 そこはすごく達成できたかなと。

人と出会って話すのも重要なんだということでしたが、いかんせんそういうの苦手なのでそっちは全然でしたが。

あとごはん美味しい。

RT-AC1200HP 使ってみました。

モニターに当選したのでRT-AC1200HP で遊んでみた。

ゲストネットワーク機能を試したいと言いながら、モニタリング機能のほうが興味深々だったので主にそちらを。

f:id:paihu:20170625221849j:plainf:id:paihu:20170625221901j:plain 青く×字に光るのがかっこいい。

使用感、普通に使う分には全く問題ない感じです。ロフトがあるのですが、床に置いておいても ロフト上でも問題なく使えています。

機能とか

個人的に便利だなぁと思ったところだけ。

  • ゲストネットワークが2.4G、5Gともに3つも作れる。個々にイントラネットへのアクセス許可/拒否設定を行ったり、個々に有効期限を決めたりできる。
    有効期限を決められるのが便利で、来客後、消し忘れるみたいなことがないです。 f:id:paihu:20170712211542p:plain
  • Firewall 機能として、一般的なIPaddress,portによるもののほか、HTTPに限ってはURLやキーワードでフィルタリングできる
  • ルータから ping,traceroute,nslookupが実行できる。
    何気に時々これは便利で、PC側の問題なのか、そもそもNW側が悪いのか、みたいな切り分けがしやすいです。

トラフィックモニタリング(本題)

まず、管理画面に複数個所からログインすると、 先行ログインした方のセッションが切れます。

一般家庭向けだし、それが安全だよねという気はしますが、こっちで(全画面で)グラフ表示させつつ、 別のところでちょっと設定いじろうとするとグラフが…… となるのが悲しいところ。

今回、主にトラフィックモニタリング機能を見てみたくて触っていたのですが、

  • リアルタイムデータはホントにリアルタイムに取得してきたデータを表示するもので、 開いた時点以降のデータしか表示されません。
  • 時間、日データについては、ルータの電源off/on でデータが消えてしまいます。 内部に静的に保持する仕組みではないみたい。
  • WANトラフィックと有線+無線 トラフィックの合計が一致しない。 有線接続PCでWebアクセスすると、WANトラフィックにどーんと出ますが、有線のほうには全然でない。 これは理由がよくわからない。f:id:paihu:20170712205635p:plainf:id:paihu:20170712205640p:plain なお、無線ではちゃんと想定した感じに出ている。 f:id:paihu:20170712230745p:plainf:id:paihu:20170712230753p:plain
  • トラフィックグラフ中をクリックするとクリックした時点での時間とか数値がポイントできるんですが、 時間とともにグラフは動いていきますが、クリックした点の物理的なx軸位置は変わらないので、なんだか微妙な感じに。 (y軸方向は、スケールが変わるとちゃんと移動する) それが良いみたいなときもあるのかもしれませんが、残念な感じでした。 f:id:paihu:20170712205857p:plain

リアルタイムデータを取得している部分から、定期的にデータを拾って手元PCとかに静的ファイルとして貯めればいいかなと思いましたが、 前述の、複数個所からログインすると先行ログインした方のセッションが切れる。という問題があって辛い感じです。

トラフィックモニタリングは、ついでにSNMPに対応してくれればなぁという感じでした。 中身linuxなのでsnmpデーモン入れて設定画面作ればなんとかなりそうな感じですし。

最近の新しい Google Chrome にストア以外から拡張をインストールする

はじめに

Google Chrome では、ストア以外から拡張をインストールすると、次回起動時に無効化されてしまいます。

(開発者モードでパッケージ化する前の状態の拡張をインストールすると、次回起動時でも有効になりますが、 起動のたびに開発者モードがonになってますよとポップアップで警告してくれます。)

社内で使うために手元で作ってるのに、登録してストアからインストールするのもつらいよなぁ (個人アカウントは使いたくない、会社用にアカウントを作るのは社内手続きが面倒)

みたいな状態だったので、なんとかしたいと調べてみた感じのことを書こうと思います。

本題

  1. なにはともあれ、拡張を作らないと始まらないので作りましょう。
  2. 作ったらパッケージ化します。
  3. パッケージ化したのをインストールしてappIDを確認しておきます。(パッケージ化前とはID変わります、バージョンアップのために鍵はなくさないようにしましょう)
  4. 拡張インストール用XMLを作成します。
  5. グループポリシを利用してレジストリに書きます。

以上で次回Google Chrome起動時に自動で拡張がインストールされ、使えるようになります。(アンインストールや無効化できません)

拡張インストール用XMLの作成

Autoupdating - Google Chrome

拡張インストール用XMLというよりは、拡張の自動アップデート用XMLなんですが、

<?xml version='1.0' encoding='UTF-8'?>
<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>
  <app appid='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'>
    <updatecheck codebase='http://myhost.com/mytestextension/mte_v2.crx' version='2.0' />
  </app>
</gupdate>

調べておいたappIDを入力します、 codebase には、拡張の場所を記載します。 “c:\temp\xxx.crx” みたいなローカルパスも書けます。バージョンは実際の拡張(crxのmanifest)に書いてあるバージョンにしましょう。

レジストリへの記載

Policy List - The Chromium Projects

パスは HKLM\Software\Policies\Google\Chrome\extensioninstallforcelist です。 プロパティ名 1 とか 2 とかで REG_SZ なものに “appid;pat/to/xml” のような形で記載します。 ここでの path/to/xml についても c:\temp\xxx.xml みたいなローカルパスが指定できます。

デバイス用の Chrome ポリシーを設定する - Chrome for business and education ヘルプ こちらを参考にポリシーテンプレートをインストールしてActiveDirectoryなどを利用してレジストリ設定値をpush配信するほうが楽ですし、書き換えられてもログイン時に設定を強制できるので良いかと思います。

運用的な

XMLと拡張を何らかの管理ツールで各PCにpush配信するなり、Webサーバを用意して置くなりしましょう。

バージョンアップしたいときはXMLファイルを書き換えて再度 pushするなりWebサーバに配置するなりすれば、勝手にバージョンアップしてくれます。

終わりに

Firefox のWeb Extension APIはpromise対応していたりするのに Chrome のWeb Extension APIはpromise非対応な感じだったりしてつらいです。

この方法、個人のPCでも当然行えるので、オレオレ拡張を自分が使うだけなら有効だったりします。