2015年5月28日木曜日

wanderlust: use gnutls insted of starttls

wanderlust: use gnutls insted of starttls

Created: Thu, May 28 10:55:42 JST 2015
Last modified: Thu, May 28 17:31:49 JST 2015

もしも F1 v starttls-use-gnutls あるいは M-x customize-valiable starttls-use-gnutls して、すでに "nil" ではなく "t" になっているならここから先はまったく必要ない。


手元では emacs24.5, wl, starttls についてはソースからインストール、gnutls-bin は deb パッケージをインストールしてある。

最近、TLS まわりにインシデントが出てきていろいろと調整していた。いろいろとログを見ていたら手元の wanderlust が LAN 内にある cyrus-imapd に接続に行くときに
 starttls: TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits new) no authentication
で接続していることに気づいた。

これ、そろそろ TLSv1.2 にしたほうが良いだろう、ということでうろうろしてみた。

starttls.el 自体は Gnus の一部として Emacs 本体に含まれている(emacs-*/lisp/gnus/starttls.el)。そこから先、実際にサーバーとコネクトする部分についてはカスタマイズ可能な変数として starttls.el で定義されている。

starttls.c (ftp://ftp.opaopa.org/elisp/starttls-0.10.tar.gz) を読んでみると TLSv1 の記述は見つかるが TLSv1.2 の記述は見つからない。

そこで starttls.el から starttls.c(のコンパイルされたもの) を呼ぶのではなく gnutls-cli を使って TLS 接続してみる。

 ;; wl だけで有効にしたいなら~/.wl に記述。
 (setq starttls-use-gnutls t)
 (setq starttls-gnutls-program "gnutls-cli")
 (setq starttls-extra-arguments '("--insecure"))


(M-x customize-variable でもいいかも)
自己署名証明書を使っている場合に検証 (validate) で弾かれるような場合は "--insecure" オプションを有効にする。これ、本来は MITHM があるので良くない。サーバーによって "--insecure" つけるかどうかフラッグで切り替えた方がよさそう..

詳細は man gnutls-cli して確認。

wl + gnutls-cli で cyrus-imapd へ接続した場合の cyrus-imapd のログは、
 starttls: TLSv1.2 with cipher ECDHE-RSA-AES128-SHA (128/128 bits new) no authentication
のようになった。

ひょっとすると deb パッケージなどで emacs + wl な環境とかだと、すでにこのあたり有効になってる可能性高いので、必ず
 M-x describe-valiable starttls-use-gnutls
とかして t か nil かをまず確認してみること。

2015年5月18日月曜日

jessie - systemd - journalctl - ANSI escape

jessie - systemd - journalctl - ANSI escape

wheezy から jessie に dist-upgrade したマシンで、sudo journalctl -l とかすると、systemd は bold 表示する目的で ANSI エスケープシーケンス使っているのがうまく解釈されずに生で見えてしまう。


これ、読みづらいので何とかすべく調べてみた。

$ sudo journalctl -l
だと上記画像の状態。調べてみると SYSTEMD_PAGER という環境変数に "less -j4aR" 設定するとかあったので、ためしに設定してみる

$ sudo -s
# env SYSTEMD_PAGER='less -j4aR' journalctl -l


じゃぁ、"lv -c" でもいけるよね.. ということで試したら問題ない。

そこで、一般ユーザーの.bachrc に export SYSTEMD_PAGER='lv -c' と書いて(ターミナル起動しなおして)みて、sudo journalctl -l すると、だめ..

なぜだかしばらく悩んで.. この SYSTEMD_PAGER 環境変数が引き継がれてないことに気づいた..

これ.. sudo だ..

sudo, sudoers

/etc/sudoers を読んでみると、冒頭に、

Defaults env_reset

という記述がある。そこで、man sudoers してみると、env_keep オプションが見つかる。現状の sudo の状況を確認するには、root ユーザで sudo -V してみろという記述も見つかったので、やってみる。

$ sudo -s
# sudo -V
[...]

状況確認ができたので、SYSTEMD_PAGER 環境変数を保護するようにしてみる。ちなみに、まずい環境変数設定されてぼこぼこにされるのはみんな嫌だと思うので、冒頭の Defaults env_reset を無効にするようなことはやってはいけない。

visudo

/etc/sudoers ファイルは visudo というコマンドで編集する。これはロックがかかったり、万一、記述ミスがあったりすると、sudo できなくなってしまうので、こういう状況を避けるためにチェッカーが動いてくれる優れものだ。

$ sudo visudo

してみると、vi じゃなくて nano が起動してしまった..





nano を使い慣れている方はそのまま編集されるといいと思うのだが、僕はなれてないので、これを vim に替えたい。

そのまま nano を終了するには、末尾の案内にしたがって  Ctrl - X をタイプする。



変更保存するか聞かれるので "N" で保存しないを選択..

以前の Debian だと、環境変数 EDITOR とかで切り替えられたのだが、jessie だと、EDITOR 読んでもらえないみたいなので、update-alternatives で /usr/bin/editor を切り替えないとだめみたい。

まず状況確認..


$ update-alternatives --display editor
editor - 自動モード
  リンクは現在 /bin/nano を指しています
/bin/ed - 優先度 -100
  スレーブ editor.1.gz: /usr/share/man/man1/ed.1.gz
/bin/nano - 優先度 40
  スレーブ editor.1.gz: /usr/share/man/man1/nano.1.gz
/usr/bin/vim.basic - 優先度 30
  スレーブ editor.1.gz: /usr/share/man/man1/vim.1.gz



$ sudo update-alternatives --config editor
alternative editor (/usr/bin/editor を提供) には 4 個の選択肢があります。

  選択肢    パス              優先度  状態
------------------------------------------------------------
* 0            /bin/nano            40        自動モード
  1            /bin/ed             -100       手動モード
  2            /bin/nano            40        手動モード
  3            /usr/bin/vim.basic   30        手動モード
  4            /usr/bin/vim.tiny    10        手動モード

現在の選択 [*] を保持するには Enter、さもなければ選択肢の番号のキーを押してください: 3
 
update-alternatives: /usr/bin/editor (editor) を提供するためにマニュアルモードで /usr/bin/vim.basic を使います


これで visudo を呼ぶと vim で編集できるようになる。

$ sudo visudo





OK.
man sudoers して、env_keep を使って SYSTEMD_PAGER をリセット対象から外すように指定してみる。





$ env SYSTEMD_PAGER='lv -c' sudo journalctl -l



OK.

これで一般ユーザ の(rootじゃないよ) ~/.bashrc に

exports SYSTEMD_PAGER='lv -c'

と 書いておくと次からはなにも考えずに sudo journalctl -l しても ANSIエスケープシーケンス見えてしまうことはない && bold (フォントの関係などで bold できないばあいは一段明るい色で強調表示される)表示される。はず。

------

PS.


vim をカラフルにするには、(ここの画像のは jellybeans.vim)カラー設定を書くかいただいてきて、~/.vim/colors に *.vim ファイルを保存するか ln -s しておく。

jellybeans の場合、
https://github.com/nanotech/jellybeans.vim から git clone するか http で zip をもらってきて unzip する。

で、 ~/.vimrc に
set background=dark
colorscheme jellybeans
syntax on
filetype on

みたいにかいておくとできる。

2015年5月14日木曜日

nfsv4 + krb5 on jessie

 

ここが参考になる。

https://www.debian-administration.org/article/570/MIT_Kerberos_installation_on_Debian

あと、krb5-doc パッケージを入れておいて w3m file:///usr/share/doc/krb5-doc/index.html すると krb5 関連のドキュメントを読める。

実は以前も DNS で SRV レコードを作成してサービスの検出に使う方法 (http://web.mit.edu/Kerberos/krb5-1.5/krb5-1.5.4/doc/krb5-install/Hostnames-for-the-Master-and-Slave-KDCs.html) を取っていたのだが、nfs-kernel-server, krb5-{kdc, admin-server} のマシンの HDD とばしてしまって環境つぶしちゃってから、復活させずに放置していたのを jessie に dist-upgrade したのを期に復活させてみた。

以前の nfsv4+krb5 では今となっては脆弱な暗号化通信(すでに weak_crypto とされてる des-cbc-crc:normal)しかサポートされてなかったのだが、古い nfsv4 がいない(後方互換すてられる)なら aes などが使えるので、des-cbc-crc とか使ってるマシンは早めに dist-upgrade したほうが良いと思う。

いろいろ忘れてて苦戦した記録...

DNS での krb5 関連の SRV レコード設定


bind9 での例

/etc/bind/db.example.org


[...]
$ORIGIN example.org.
[...]
server1               A      192.0.2.1
                      AAAA   2001:db8::1
ntp1                  CNAME  server1
kerberos              CNAME  server1
_kerberos             TXT    "EXAMPLE.ORG kerberos service"
_kerberos._udp        SRV 0 0 88  server1
_kerberos-adm._tcp    SRV 0 0 749 server1
_kerberos-master._udp SRV 0 0 751 server1
_kerberos-master._tcp SRV 0 0 751 server1
_kpasswd._udp         SRV 0 0 464 server1

これで TTL を小さくして serial をあげて systemctl restart bind9 する。スレーブがあるならそっちで rndc retransfer example.org して更新しておく。設定終わったら TTL 元に戻しておいた方がいいと思う。(いじるレコード毎に小さなTTL書くほうがいいかもしれない)

こうすると server1.example.org は ntp1.example.org や kerberos.example.org という fqdn でもアクセスできるようになる。

dig @ns.example.org kerberos.example.org 
dig @ns.example.org _kerberos._udp.example.org SRV
とかで期待したとおりに動いているか確認する。


/etc/nsswitch.conf

しばらく /etc/krb5.conf で kerberos.example.org を指定しても kdc へつながらずに悩んだ(kadmin.local はつながるけど kadmin や kinit が接続できない症状がでてた)のだが、/etc/nsswitch.conf を修正するとうまくうごいた。

デフォルトでは
hosts:   files mdns4_minimal [NOTFOUND=return] dns mdns4
こうなっているのを、dns を files の直後に持ってきて mdns4_minimal よりも優先する。
hosts:   files dns mdns4_minimal [NOTFOUND=return] mdns4

mdns4 って avahi-daemon のだけど、使おうと思ったことないのでなにをどうするものなのかよく知らない...

/etc/krb5.conf 

[libdefaults]
default_realm = STAINED-G.LOCAL
dns_lookup_kdc = true
scan_interfaces = true
dns_lookup_realm = true

srv_lookup = true
[...]
[realms] 
[...]
EXAMPLE.ORG {
default_domain = example.org
kdc = kerberos.example.org 
admin_server = kerberos.example.org  
}

みたいに指定しておいて

kinit や kadmin でうまく kdc や admin_server につながればOK。

その他調整が必要な設定ファイル

  • /etc/idmapd.conf
 環境に応じて /etc/krb5.conf などと整合性とれるように設定する。

[General]

Verbosity = 0
Pipefs-Directory = /run/rpc_pipefs #<-- ここ
#Domain = localdomain
Domain = example.org               #<-- ここ
Local-Realm = EXAMPLE.ORG          #<-- ここ

[Mapping]

Nobody-User = nobody
Nobody-Group = nogroup

[Translation]
Method = nsswitch,static          #<-- ここ
GSS-Methods = nsswitch,static     #<-- ここ

[Static]
whoami@EXAMPLE.ORG = iamjon
              #<-- ここ

  • /etc/default/nfs-common
NEED_IDMAPD="yes" 
NEED_GSSD="yes"

  • /etc/default/nfs-kernel-server
NEED_SVCGSSD=yes

krb5kdc の起動時 (sudo systemctl start krb5-kdc) に Couldn't open logfile [...] というようなエラーが表示されることがある。これ、/etc/krb5.conf と /etc/krb5kdc/kdc.conf の [logging] セクションで kdc = FILE:/var/log/krb5kdc/kdc.log のような指定していて、krb5.conf と kdc.conf で指定違ってたりすると起こる模様..

jessie の krb5.conf(5) を読むとそもそも [logging] セクションの記述がないので、/etc/krb5.conf には [logging]セクションは 記述しない = 削除する のが正解だと思う。

おそらく、以前のバージョンから引き継いで使ってる場合に残っちゃったのではないだろうか。(以前導入した時に私が kdc.conf と混乱して記述しちゃった可能性もないではないが、検索すると結構あちこちで見かけるので..)