Yubikeyのキーボード入力を無効にする

FIDO U2F対応のデバイス認証に利用出来るYubikey。最近はGoogleだけでなくDropboxGithubでも使えるようになってきたので個人用に入手した。

購入したのはこちらのEdge-n。USBポートにほぼ埋まるので差しっぱなしで運用できる。

www.amazon.co.jp

早速PCのUSBポートに挿してみると、キーボードの設定ウィザードが立ち上がる。どうもキーボードとして認識されているらしい。 さらにデバイスの頭のところを触ると謎の文字列が入力される。これは二段階認証でChromeを使っている間だけでなく、どのアプリでも入力されてしまう。

調べてみるとこれは意図的にやっているらしい。

Why does the YubiKey act as a keyboard? | Yubico

各種OSで認識されやすくするのと、OTPなどを使いやすくために、あえてキーボードとして振る舞うようにしているとのこと。

個人的にはOTPは使わないし、不意に触って事故ってしまう危険の方が高いので、無効にできないか調査。やはり同じく気になっている方もいるようで、いくつかの方法があった。自分はすでにKarabiner を使っているので、今回はこれを使って設定する。 *1

KarbinierのGithubのIssueにYubikeyのキーボード入力をON/OFFする設定についてのやりとりがあり、ありがたいことに設定例まで残してくれていた。そこから最低限の部分を抜き出して以下のprivate.xmlを作成。

適用するには以下の手順。

  • Karabinerのメニューから設定を起動しprivate.xmlを開く
  • 上記の設定をペースト (すでに設定がある場合はitemのみをコピー)
  • Karabinerの設定画面に戻りXMLを再読み込み
  • Ignore Yubikey keyboard inputという設定が表示されるので、チェック

これでYubikeyをタッチして何も入力されなくなればOK。

*1:試していないがyubiswitchというアプリもある。pallotron/yubiswitch · GitHub

rootのcrontabと/etc/cron.{daily,hourly,weekly,monthly}の違い

/etc/cron.daily に配置すると、rootのcrontabに書いた場合といくつかの違いがある。

serverfault.com

たとえば、$HOME という環境変数//root という形で異なったりする。 スクリプトの冒頭で $HOME/.bashrc とかやっていると失敗するので、なるべく紛れのない形式で書くようにする。

他にもcronは、通常のログインシェルでは問題なく動いていたスクリプトが失敗したりして、ハマりやすい点が多い。 代表的なのは以下のあたり。

  • 環境変数がほとんど設定されない (HOME, SHELLくらい)
  • ログイン設定 (.bashrcとか) が設定されない
  • エラーが出ない。mailで送られたりするので、ちゃんと設定されていればいいが、そうでなければログファイルにリダイレクトしておく必要がある。
  • terminalが割り当てられない (前回の記事 http://ikeas.hatenablog.com/entry/2015/08/14/032349)

ほかにも、cronでの失敗例はやまほどあるはず。しかもエラーが分かるのが実際に実行された後なので、一度失敗して、修正して、また別のところで失敗して、修正して、、、、時間ばかりが経っていくというループはよく陥いる。

run-parts コマンドあたりを駆使すればうまくテストできそうな気がするが、これは未検証。

cron内のsshでsudoするには

結論は一番下に書いてあります。

sshでsudoするとよく見るメッセージ

sudo: sorry, you must have a tty to run sudo

これは、/etc/sudoers で terminal を要求するようになっているためである。なぜデフォルトでそうなっているのかもコメントに書いてある。

#
# Disable "ssh hostname sudo <cmd>", because it will show the password in clear.
#         You have to run "ssh -t hostname sudo <cmd>".
#
Defaults    requiretty

理解した上で設定を変更する場合は、それで解決するので、これ以降は読まなくて良い。 ちなみに、特定のコマンドだけ設定を変更することもできるらしい。

sudo - How to disable requiretty for a single command in sudoers? - Unix & Linux Stack Exchange

ここまではすでにいくつもの記事に書かれている。本題はここから。

コメントに書かれているように ssh -t をすれば、terminalから叩く場合は問題なくなる。

それでは cron から、さらに sshでsudoをするとどうなるのかというと、 -t だけでは足りないので、 -tt とする必要がある。 -tt オプションについてはCentOS 6のman sshで以下のように書かれている。

-t      Force pseudo-tty allocation.  This can be used to execute arbitrary screen-based programs on a remote machine, which
         can be very useful, e.g. when implementing menu services.  Multiple -t options force tty allocation, even if ssh has
         no local tty.

つまり local tty がない場合は、複数回 -t オプションをつけるように、とのこと。

では、実際に試して見る。

まずは、以下のスクリプトを作成。リモートサーバではパスワードなしでsudoできるようにしておく。

#!/bin/bash -x

ssh remote-host sudo id
ssh -t remote-host sudo id
ssh -tt remote-host sudo id

crontabで仕掛ける。

* * * * * path/to/a.sh >> path/to/cron.log 2>&1

しばし待つと、以下のログが出る。

+ ssh remote-host sudo id
sudo: sorry, you must have a tty to run sudo
+ ssh -t remote-host sudo id
Pseudo-terminal will not be allocated because stdin is not a terminal.
sudo: sorry, you must have a tty to run sudo
+ ssh -tt remote-host sudo id
tcgetattr: Invalid argument
uid=0(root) gid=0(root) groups=0(root)
Connection to remote-host closed.

-ttでうまく実行されたが、変なエラーがでる。 tcgetattr: Invalid argument について調べると以下のページがヒットした。

mysql - why is the `tcgetattr` error seen when ssh is used for dumping the backup file on another server? - Stack Overflow

このエラーは terminal の情報を取ろうとして出ているものらしい。それ以上の詳細は書かれていないが、対応策として、おもむろに/dev/nullにリダイレクトしている。他のいくつかのページを見ていても、harmlessなので無視して良いとか言っているが、本当だろうか。

Problem using Net::OpenSSH->capture to su to another user https://groups.google.com/forum/#!topic/comp.security.ssh/ISjpJhTxKVY

結論

調査が十分にできなかったが、ひとまずの結論としては、「cronからの場合、ssh -tt sudo ...とすれば動く。軽く使う用途なら、これで問題なさそう。しかし万全を期すならもう少ししっかり調べたほうが良い」というところ。

sshからのsudoは構成管理ツールやデプロイツールで比較的よく使う組み合わせで、cronで動かすこともあると思うので、その辺のソースを調べれば、もう少し情報が集まるかもしれないが、これは今後の課題。

早送りと巻き戻し

テープを知らない世代には「巻き戻し」の意味するところがわからないようだ。

ところで、たまたま英語での早送りと巻き戻しの説明を目にすることが気がついがたのだが、英語でも巻き戻しは "rewind" である。(windは巻くという意味の動詞) 早送りは "fast-forward" なので、日本語同様釣り合っていない。テープを巻く感覚のない人間には、なぜ "fast-reverse" とか "fast-backward" でなく、"rewind" なのかがさっぱりわからないだろう。

英語圏でも同様の問題を持っている人がいるのではないかと思ったら、少ないながらもいるにいるらしい。

"It's Not Rewind; It's 'Fast Backward'" | BrendanShick.com

巻き戻しにせよ、rewindにせよ、すでに一般的な言葉として定着しているのですぐにどうこうなるものでもないが、言葉の変遷は徐々に起こるものなので、テープを知らない世代が増えれば (テープを知る世代が減れば)、自然と使用される比率も変わっていくのだろうと思う。

資料やブログを下から読む

人の作った資料やブログを読むときに途中までは上から読んでいるのだが、途中から一番下までスキップしてしまって、下から読んでいることがある。自分でもあまり意識せずにやっているので、なぜかと思ったが、おそらく「全体の分量が把握できる」というのが一番の理由な気がする。つまり、この文章を読むのに後何分くらいかかるのか (今何パーセント位なのか) というのが、読み始めてある程度時間がたってくると、気にしてしまうのだ。

Webメディアの記事には、この記事を読むのにかかる目安時間が冒頭に書かれているものがある。(こういうWordPressプラグインもあるらしい)

f:id:ikeas:20150624001948p:plain

あるいはKindleには、この本 (あるいはこの章) を読むのにかかる時間が表示される機能がある。

f:id:ikeas:20150624002757p:plain

このような機能があることを考えると、ある程度予測を立てた上でアプローチしたい、とか、状況が込み入ってきたときに俯瞰したい、というようなことには、そこそこニーズがあるらしい。

テキストエディタの話になるが、Sublime TextにはMini Mapという機能がある。これはスクロールバーの機能を拡張したもので、開いているファイル全体を縮小表示して、現在の表示領域にハイライトを当てるものである。(下図右側)

f:id:ikeas:20150624001554p:plain

この機能はスクロールバーよりもはるかに直感的に現在位置を把握することができる。この種の表示の仕方は、地図や画像などを拡大した際に使われる縮小マップにも見られる。

全体を俯瞰したいというこの行動は、自分自身、昔はそれほど実施していなかったように思う。これは時代の流れでより簡潔に結論を得るために身につけたものなのか、それとも年齢に伴って記憶できる容量が狭まってきたことにより、より早く結論を得るために身につけたものなのかは定かではない。(その両方かもしれない)

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

ちなみに、この文章はほとんどスペースなので、下から読んでも分量は変わらない。しかもさしたる結論も用意されてはいない。

普段使いのブラウザその後

ikeas.hatenablog.com

結局Chromeに戻してしまった。一番の理由は、Safariが不安定なこと。

  • タブがクラッシュすることがある(特にGoogle Docs)
  • ロードが止まるときがある(すぐにリロードすると問題なく読み込むのに。。)

ChromeのNotificationのデザイン(リッチ通知というらしい)だけ、なんとかなればなぁ。

ちなみにsVimの元になったというcVimをインストールしてみたけど、これはすごい。

Accordions on Mobile

アコーディオンメニューはモバイルでは全体のナビゲーションをさせるのに便利。ただし、中のデータが大きすぎると、閉じることができない。これは、ヘッディングの固定や、閉じるボタンを下に配置するなどの方法で解消できる。

Accordions on Mobile