9/27/2016

[note] sambaで一部のファイル・フォルダが文字化けする不具合の修正について

今回は、Linuxサーバのワークアラウンドです。

修正対象は、Linuxサーバ上のsambaの問題です。少し前から、samba経由でサーバのファイルにアクセスすると、何故か一部のファイル・フォルダの一部の名前が文字化けというか、本来のものと違う無意味(人間からすれば)な文字列に置き換わって表示されてしまうという、非常に不愉快な現象が起こっていたのでありまして。

具体的には、"_1AD3ZK"とかいう感じに、アンダーバーで始まるアルファベットや数字からなる数文字の名前になってしまうのです。当然ながら何のファイルだか全くわかりません。割とひどい不具合です。サーバの中から見れば普通に元の名前で表示されるんですけれども、サーバとしては普通に致命的と言えるでしょう。

ただこれ、表示が変なだけで、ファイルやフォルダへのアクセスは変わらず可能なのです。sambaによる中継は出来ている、という事ですね。また発生率はフォルダ中の高々数%程度位と全体からすれば一部に過ぎず、あとこれはたまたまかも知れませんが自分にとって重要なファイルが文字化けした事は無く、実際の利用上はさほど深刻な問題とまで感じる程ではありませんでした。

本件文字化けが、全部ではなく一部だけに発生する、という点から、その原因は文字コード設定の不具合のような単純なものではないだろうと思われた事、実際に文字コード関連の設定を色々試してみても治らず解決には相当の手間がかかる事が予想された事などから、無視しようと思えば出来る事を幸いに見てみぬふりで放置していたのです。が、不便かつ不愉快な事は間違いありませんし、何時までも放置するのもいざ重要なファイル類が化けた時に困るだろうし、精神衛生上も極めてよろしくないだろう、という事で、発起して対処する事にしたわけです。

以前調べてみた時にもそうでしたけれども、これだと思えるような情報があまり無く、原因についての仮説を立てるのにも、その検証をするにもいささか苦労する羽目になりましたが、結論から言えば解決出来ました。smb.confの設定に下記の通りオプションを追加すれば良いのです。

<修正方法>

/etc/samba/smb.confの[global]セクション内に、下記オプションを追加

 mangled names = no

これだけです。なおこのオプションは、sambaの公式ドキュメントによれば、"長いファイル名を切って8.3DOSフォーマットに合わせる"、というものです。それをnoにするのだから、ファイル名を変換しないように設定した、という事ですね。その変換処理こそが文字化けの原因だった、というわけで、これで治ります。

ただ、治るのはいいのですが、漠然とした不安も感じないではない、というか。というのも、オプションの説明を文字通りに受け取れば、本来このオプションはSambaでやり取りされるべきファイル名のフォーマットに適合させるためのものであって、従ってそれを無効にすれば規格に適合しない不正規なファイル名がやり取りされる可能性が生じるだろうわけで、それが何らかの不具合を引き起こす可能性も懸念されてしまうところなわけなのです。

もっとも、mangle処理自体からして、ハッシュ関数的に処理後の名前の間で衝突も起こしうる不完全なものなのだし、勿論文字化けはするしで、いずれにせよ不具合は内在していて、相対的な問題でしかないと言うべきなのでしょう。そして、今回の場合については、無効にした方が遥かにマシである事は明らかですから、今回の不具合については一応の解決、といえるのだろうと。

ただ、どうにもすっきりしません。その理由は、やはり具体的な原因等が把握出来ていない事によるのでしょう。今回の不具合は割と基本的な部分の仕様変更によるものと推測されるところ、そのような重大な仕様変更がどういう理由、経緯で行われたのか、具体的に何がどう変更されたのか、他に同様の不具合をユーザ側で警戒すべき変更点はないのか、とか、何もかもわかりませんから、おそらくは不要な心配とは思いつつ、色々と不安と共に疑問を抱かざるを得ないのです。しかし、セキュリティ対策等で基本部分にも手が加えられる事も頻繁にある現状にあっては、その辺は考えても多分にキリがない事なのでしょうし、ともかくも自身にとっての問題は解決出来たのだから、これでよしとすべきなのでしょう。というわけでこれでおしまい。やれやれです。

(追記・補足)

その後しばらく使ってみて、やはり副作用がある事を確認しました。その内容を対処方法と共に追記しておきます。

症状としては、いくつかファイルがアクセス出来なくなるというものです。アクセス方法によって起こる現象はまちまちなようなのですが、見えるけれど読み込み出来ないとか、そもそもファイルが見えないとか、いずれにせよ読み書き不能になるため要対処です。問題が発生したファイルの名前をざっと確認してみたところ、"?","!","<"やダブルクオーテーション等、半角のエスケープ対象文字が含まれるものばかりでした。察するに、mangleオプションを有効にしていた時は置き換え等が自動的になされていたのが、それが無効になった事で不正なファイル名として弾かれるようになってしまった、ということなのでしょう。

勿論mangleオプションを復活させるわけには行きませんから、これらの禁止文字のみを置換するよう設定してやる必要があるわけですが、その方法も普通に存在しており、samba公式でも例示されています。具体的には下記の通りsmb.confにファイル名の変換用のマッピング設定を追加してやればいいのです。なおvfsはvirtual file systemの略。元々色々とアドオンを噛ませる事が出来るようになっているのですね。

<禁止文字の置換設定>
 vfs objects = catia
 catia:mappings = 0x22:0xa8,0x2a:0xa4,0x2f:0xf8,0x3a:0xf7,0x3c:0xab,0x3e:0xbb,0x3f:0xbf,0x5c:0xff,0x7c:0xa6

catia:mappingsの設定値がマッピングの内容になります。ここでは9対、それぞれ下記のように置換する設定になっています。当然ながら全部半角。

0x22:0xa8 ダブルクオーテーション(")->ウムラウト(¨)
0x2a:0xa4 アスタリスク(*)->汎用通貨記号(¤)
0x2f:0xf8 スラッシュ(/)->スラッシュ付きオー(⊘)
0x3a:0xf7 コロン(:)->除算記号(÷)
0x3c:0xab 山括弧左(<)->二重山括弧左(《)
0x3e:0xbb 山括弧右(>)->二重山括弧右(》)
0x3f:0xbf クエスチョンマーク(?)->逆さクエスチョン(¿)
0x5c:0xff Yenマーク(\)->Yの分音記号(ÿ)
0x7c:0xa6 垂直線(|)->分割垂直線(¦)
 
実は公式の例ではこれにもう一対、半角スペースを'±'に置き換えるものが加わっているのですけれども、これは流石に違和感が強く、また元々半角スペースは問題なかった事もあって不要と判断し、除外しています。このまま大丈夫であって欲しいところですが、さて。

ちなみにsamba公式によれば、本設定は若干オーバーヘッドがかかるので、必要な場所(フォルダ等単位で)のみの適用を推奨するという事です。当然と言えば当然の話ですが、今回適用対象のサーバは小規模ネットワーク上につき、負荷も高が知れているだろうから問題なかろう、と無視して[global]内に追加しました。結果、無事問題の各ファイルは禁止文字が置換され、アクセス可能になったのでした。

というわけで修正は以上です。もう大丈夫かな?

[過去記事 [note] cifs経由のsymbolic linkが突然stat不可に]
[過去記事 [IT] sambaの3.6.3以前全てに脆弱性]