連載 /lnside Cygwin— 図 10 Pernnss10n denied /My Pictures $ nts 1 上 ( たぶんバージョン 3.0 ) では、ドメイン・コントローラの いので同し結果になってしまう。しかし、将来の Samba ドメイン・コントローラの発行した SID を使ってくれな ンでユーサー認証することも可能だが、現犬の Samba は Samba サーバーを NT ドメインに参加させて、ドメイ きない。 には、このセキュリティ言当子を正しく処理することはで にオ褓内された Windows のアカウントしか扱えない ntsec した SID を用いることにある。 /etc/{passwd,group} ュリテイ記述子に、 UNIX のアカウント情報をもとに生成 この原因は、 Samba がファイルやディレクトリのセキ イルに書込別雀限がないといわれてしまう。 ない。次に、コピーしたファイルを消そうとすると、ファ も、ファイルのユーサーとグループも正しく表示されてい ラーになる。 ls ー 1 で見るとたしかに失敗している。しか 自体は成功するものの、アクセス権限の変更に失敗して工 ように実行権限が与えられている。このファイルのコピー のアプリケーションか作成したファイルなので、前述した ーム・ディレクトリにコピーしている。これは Windows たヒ、ツトマッフ・ファイル ( Ⅱ tsecl. bmp ) を、 UNIX のホ たとえは図 10 では、 Windows の、、ペイント " てイっ て怒られることが多くなる。 イルシステムを操作しているときに、アクセス権限につい Cygwin を使っていると、 Samba 経由で UNIX のファ ntsec は Samba と相性が悪い。 ntsec を有効にして Samba と相性が悪い みよう。 されました " といわれたら、ファイルの実行権限を疑って ので、 Windows のアプリケーションに、、アクセスカ甘巨否 Execute を使っているのは start コマンドだけではない / 当 Pictures $ - rm: 「 nve w 「ⅱ 0 ー p 「 0 士 ect f i 、 / / め / ん j i 今 / S81. ' ? y ′ Pictures $ rm / / 沚 0 / f ⅵ ie / ntse:l . 0 1 41606 binist 2986038 「 15 16 : 23 //t_hcho/fuj ieda/ntsecl . / Pictures $ ls ヨ / / 0 / 化 j i a / S81. : preserving 「 mi i 師 fo 「 //ul 、 oho/fujieda/ntsecl しー ~ / 物′ Pictures $ nts 1 . //lhoho/fuj ieda - rwx¯ 1 fuj ieda Ckmain U 2986038 物「 25 09 : 27 ntsecl 上 np ま 図 11 # 朱なアクセス権のオンパレード ファイル ( E ) : 新 e れ叩跖 e 所有者 Q ) : 回旧 da (KazuhWo F 可 da ) 万イルのア恤ス宿 名前せ Fveryone 回肥 da (Kazuhiro F 可旧 da ) 特殊な乃セス ( R ) なツ = 特殊なア社ス権 (RWDPO) 特殊なア社ス権 ( この間題への対処法が Samba のバージョンアップを 待っというだけではあんまりなので、 CygwinDLL 1.1.7 から、工竟変数 CYGWIN に設定するオプションとして nosmbntsec が追加された。このオプションを指定する と、共有ディレクトリでは ntsec の機能が無効になるの で、 Samba 上のファイルの操作でいちいち怒られること はなくなる。ただし、このオプションはその名前に反して、 Samba にかぎらすすべての共有ディレクトリに適用され るため、 Windows NT / 2000 がサーノヾーとなっている共 有ディレクトリでも ntsec が無効になるので注意してほ しい。 このオプションを cygwin. bat で設疋する方法を以下 に示す。見てのとおり、 CYGWIN 環境変数に複数のオ フションを指定する際には、オプションをスペースで区 切って並べればよい。 chdir *cygwin*bin SET CYGWIN=ntea nosmbntsec bash ——login —i ←挿入 発行した SID を使うようになるので、 るはすだ。 120 この問題は解決す アクセスコントロール・エテイタと相性がい UNIX のアクセス権限をエミュレーションするために ntsec はファイルやディレクトリに Windows ではありえ ないような ACL を設定する。そのため、ファイルの、、プ ロノヾティ " →、、セキュリティ " で表示される、 Windows の アクセスコントロール・エデイタとの相性がたいへん亜い ・ ( し、 0 Ⅵⅱ ndowsNT4.0 のアクセスコントロール・エデイタ は、かなり貧弱である。 ntsec によって ACL が設定され たファイルをこれで見ると、、、特殊なアクセス権 " のオン パレードになる ( 図 11 ) 。前述したように、ファイルに実 行権限がないことは稀なので、言もムみ権限 (R) だけの設 定すら特殊なアクセス本及いになる。さらに、 NT 4.0 の UNIX MAGAZINE 2001.6
連載 /lnside Cygwin— 最後に、今回紹介した ntea と ntsec を利用すると、 どれくらい stat の実行速度が変わるかを調べてみよう。 ntea と ntsec がそれぞれ用いるファイルの拡張属性とセ キュリテイ記述子は、どちらもファイルシステムのマス ター・ファイルテープル ( MFT ) 4 のファイルレコードに オ褓内される。 MFT は普通のファイルよりは高速にアクセ スできるはすなので、ファイルの頁を読み出す従来の工 ミュレーション方式よりも、 ntea か ntsec を有効にした ほうが stat か速くなることか期待できる。 前々回のべンチマークとまったく同じ環境で、 lmbench に含まれている lat-syscall を用いた fstat の遅延の計測 結果を表 1 に示す。測定対象として、 ntea 、 ntsec とも に UNIX のアクセス権限に 644 を設定したファイルを使 用した。 残念ながら、かえって遅い結果が出ている。前々回述 べたように、 lmbench の計測方法では同しファイルに対 して繰り返し fstat を実行している。そのため、キャッシ ュされているファイルの先頭を読むだけの通常の方式と、 ファイルレコードの特定の位置を読む必要がある ntea や ntsec との差が出たようだ。 ntsec が ntea よりも遅いの は、 ntsec では ACL から UNIX のアクセス権限のフラ グを言算するコストがかかるためだろう。 こんな結果ではおもしろくないので、より現実的な状兄 での性能を測ってみよう。たとえは、 bash でコマンドラ インの : 頁で TAB キーを押してから、制彳卸カ唳ってくる までにかかる時間なんてどうだろう。これは、実行・パスの 通ったディレクトリのすべての実行ファイルク架索にかか る時間を調則することになる。この時間を以下の手順て何 度か繰り返し測定して、もっとも速かった結果をまとめた ものを表 2 に示す。 $ echo 'AVAI' ー time bash —i あちこちのディスクプロックに存在するファイルの先 頭を読む通常の方式より、 MFT のファイルレコードです む ntea や ntsec のはうがイ当立であることがよく分かる結 4 inode テープルのようなもの。 ようにしたはうがいいかもしれない。 stat の実行速度の変化 UNIX MAGAZINE 2001.6 表 1 fstat のべンチマーク ( 単位 : 秒 ) 通常 ntea ntsec 122.4 157.8 24.5 表 2 bash を使ったべンチマーク ( 単位 . 秒 ) ) 甬常 ntea 19.6 2.73 1.56 果になっている。ただし、 ntea については、拡張領域には 何い褓内されていない状態で言測しているので、拡張領域 の言もムみはおこなわれていない。それを考えると、 ntsec が ntea よりも速いのは不可解だが、調べている時間がな くなってしまったので目をつぶってほしい。 おわりに 今回は、 Windows NT / 2000 固有の機能を使ったアク セス権限のエミュレーション方式である ntea と ntsec に ついて説明した。 今回は ntsec についてたくさん苦言を述べたが、それで も僕は ntsec というエミュレーション方式を気に入って いる。現在の ntsec のイ兼には、僕の要望がかなり大きく 反映されているので、僕が気に入らなかったら誰が気に入 るんだという説もある。 ntsec について説明を書きながらいろいろ調べているう ちに、いくつかバグがみつかったので、 ntsec の作者の Corinna と相談しつつ、なるべく Cygwin DLL 1.3.0 がリリースされる前に直すつもりだ。 次回は、 Cygwin の inetd や sshd について説明する 予定である。 ( ふしえだ・かすひろ北陸先立斗 ! 物翅寸大凝完大学 ) 123
図 12 NT 5.0 ってなんでしよう 現在のセキュリティ情報を変更しますか ? ュ竺」一 連載 /lnside Cygwin— W 扣 T セキュリティー 図 13 アクセス許可の頂番か正しくありません ! に胃己挈寺 ! 3 日れ ? リが無効になる可能性がありま魂続行してアクセス許可を正し並べ替えるには、 アクセスコントロール・エデイタは拒否の ACE を扱えな いので、 ntsec カ甘巨否の ACE を設疋すると図 12 のよう な笑うしかないエラーになってしまう。 Ⅵ Tindows2000 のアクセスコントロール・エデイタは いくらかましで、拒否の ACE ぐらいで弱音を吐いたりは しない。しかし、 ntsec の設定する ACL に対して、図 13 のような不平をもらす場合がある。この図の、、アクセ ス許可 " とは ACL に含まれる ACE のことである。この 工ラーの孑商どおり、 ntsec が ACE を並べる順序はたし かに正しくない。 Microsoft のドキュメント 3 には、、、拒否の ACE を並 べてから許可の ACE を並べるべし " というルールか示さ れている。しかし ntsec は、許可と拒否の ACE を分け ずに並べることがある。 たとえば、 chmod を使って—rw—r— -rw— ( 646 ) とい うアクセス権限を設定したとしよう。このときにファイル の所有者カワァイルのクルーフに属していると、 ntsec が 設定する ACL は以下のようになる。 1. 所有者への許 - 可 : rw- 2. グノレーフ。 , の孑巨否 : —w— 3. グルーフへの許可 : r- 4. Everyone , の言午可 : rw— UNIX のアクセス権限のモデルでは、 others の書込み 許可があったとしても、グルーフ。の書込みは拒否しなけれ はならない。しかし、 Microsoft のドキュメントに従っ て、グループの書込み拒否を ACL の先頭にもっていく 3 http://msdn.microsoft.com/library/psdk/winbase/ accctrl-2hik. htm UNIX MAGAZINE 2001.6 と、グループに所属している所有者の書込みまて拒否され てしまう。したがって、この順番に並べるしかない。 さきのドキュメントには、 ACE を並べる国について、 もう 1 つルールが示されている。、、ディレクトリから継承 する ACE よりも、ファイルのグループに関する ACE を 則に並べるべし " というものだ。 ntsec はこのルールを絶 対に守らないので、ディレクトリから継承する ACE があ るだけで図 13 のエラーになってしまう。これには何か理 由があったと思うが、たんなるバグのような気もしてきた ので、そのうち直すとしよう。 いすれにせよ、アクセスコントロール・エデイタがェ ラーを出力したときには、アクセスコントロール・エディ タには扱えない ACL がファイルに設定されている。 れをアクセスコントロール・エデイタで触ってしまうと、 ntsec か叡疋した ACL は台無しになってしまう。 ティレクトリのアクセス権限の意味が違う アクセスコントロール・エデイタと卩印華してまで UNIX らしさを演出しようとする ntsec だが、それでも UNIX のアクセス権限を完全にエミュレーションできているわけ ではない。 これは ntsec を含むすべてのエミュレーション方式に 共通する欠点だが、書込み権限のないディレクトリにおけ るファイル / ディレクトリの作成と削除、名前の変更が可 能になっている。 UNIX のアクセス権限をエミュレーショ ンするのなら、これらは Permission denied にしなけれ はならない。さらに、実行権限のないディレクトリにある ファイルのオープンも、 UNIX なら Permission denied になるが Cygwin では可能だ。 書込み権限のないディレクトリでの振舞いは、エミュレ 121
連載 /lnside Cygwin 図 2 ntsec によるアクセスオ郷艮のエミュレー ション 図 3 Solaris 8 での getfacl/setfacl 吏用例 Eae を C れ当をは var/tmp $ 劇「に -sr var/tmp $ に himitst 」 0 4 月 19 日 06 : 29 h 」 1 fuj ie:ia ot 「 va 「ハ $ setfacl -m 「 : 「” 0 「 e : 「 - - himitsu va 「 /tmp $ getfacl himit3 」 file: himitsu g 「 Ot ト r 回 ; リ 1 曾 0 を日物ーズ上いい、灯 うこ《 0 ー、 っ 4 0 》 0 #effect ive:- #effect ive: - Windows NT / 2000 では、 NTFS 上のファイルを含 め、セキュリティの設定か可能なすべてのオプジェクトが セキュリティ言当子をもっている。セキュリティ言当子に は、オプジェクトの所有者とグループの識別子、オプジェ クトに関するアクセスコントロール・リスト (ACL) カ哈 まれている。 ntsec を有効にしたときの stat は、これら の識別子をもとにファイルのユーサー ID (uid) とグルー プ ID (gid) を決定し、 ACL の内容にもとづいて UNIX のアクセス権限を表すビットパターンを作成する。 ふつうに Windows NT / 2000 を利用していると、セ キュリティ言当子のグルーフの値とは縁がないので、ファ システムコールを、 Windows NT / 2000 の ACL を使っ イルにグループの概念があることに違和感を覚えるかもし れない。しかし、たしかに NTFS はファイルのグループ てエミュレーションしている。 Solaris の acl システム コールを使っているアプリケーションなら、 Cygwin 上 を言当求しているし、グループを変更することもできる。 でコンパイルすればそのまま動くはすだ。 ACL には、複数のアクセスコントロール・エントリ (ACE) が含まれている。 ACE には、、許可 " と、拒否 " の Cygwin DLL の配布ノヾッケージには、 Solaris の同名 のコマンドを参考に、 acl システムコールを使って作った 2 不鶤頁があり、 1 つのユーサーかグループについて 、ⅱ丿し getfacl と setfacl まで入っている。ューサーやグループ む / 書く / 実行などの行為の許可・拒否か轂定されている。 をⅲ d や gid で指定しなければならないことを除けば、使 ntsec は、 UNIX のアクセス権限のエミュレーションに ファイルの所有者とグループそれぞれに対する許可および い方は Solaris とまったく同しである。これらのコマンド 拒否の ACE と、 Everyone グループの許可の ACE を用 の SoIaris 8 - 上での使用例を図 3 に、 Windows 2000 上 での使用例を図 4 に示す。この例では ACL を使って、自 いている。 分のほかにユーザー daresore にだけ読めるという設疋を ntsec を有効にすると、 stat がファイルのツ頁のマジッ おこなっている。 クナンバーを調べるのをやめるので、 stat によってファ イルの atime か更新されることはなくなる。さらに、見 問題山積みの ntsec かけ倒しの ntea とは異なり、 chmod で実行権限を落と ntsec はそれなりによくできたエミュレーション方式だ したファイルは本当に実行できないし、言もムみ権限を落と か : これはこれでいろいろと間題を抱えている。 UNIX で したファイルは読めなくなる。 も Windows でもないコウモリのような存在として両方 acl システムコーノレのエミュレーション のユーサーに持ち悪がられる Cygwin にあって、 ntsec 最近では、多くの UNIX が ACL をサポートしており、 はとくにコウモリ色の強い、つまり UNIX でも Win- それぞれ独自に ACL を操作するシステムコールを提供し dows でもない気持ち悪さに満ちたエミュレーション方式 この点についてはのちほど触れるとして、ますは ている。 Cygwin DLL は、 SoIaris の孑是イ共している acl なのだ。 図 4 Windows 2000 での getfacl/setfacl 吏用例 」ロ / va 「 / p $ に -sr CY ーに NT ー 5.0 1 . 1 .8 ( 0.34 / 3 / 2 ) /var/ttrc $ himitsu 1 fujieda ィⅲ U 0 「 19 06 : 39 himitsu / va 「 / 0 $ 記「お 0 「 e ⅲ d ニ 11084 ( r ぉ ore ) gid : 10513 ( 旧 in Users) g 「 0 ェ s : 10513 ( D ァ in \.kers) /var/tmo $ setfacl -m user: 11034 : 「一 - himitsu 。を引 $ getfacl himitsu file: himitsu c 肥「 : 11002 # g 「伏 0 : 10513 、 -2 「 : 11084 : に一 / va 「ハ mp $ 116 UNIX MAGAZINE 2001.6
連載 /lnside Cygwin ・一 図 5 SID を含む /etc/passwd と /etc/group ・ /etc/passwd Everyone:*:O:O: , S ー 1 ー 1 ー 0 : SYSTEM:*:18:18: , S ー 1 ー 5 ー 18 : Administrator: : 500 : 513 : , S ー 1 ー 5 ー 21 ー 1730945627 ー 1768298809 ー 2076119496 ー 500 : : /bin/sh fujieda: : 1002 : 513 :Kazuhiro Fujieda , S ー 1 ー 5 ー 21 ー 1730945627 ー 1768298809 ー 2076119496 ー 1002 : 疇、 /home/fuj ieda : /bin/bash ・ /etc/group Everyone : S ー 1 ー 1 ー 0 : 0 : Users : S ー 1 ー 5 ー 21 ー 1730945627 ー 1768298809 ー 2076119496 ー 513 : 513 : Guests : S ー 1 ー 5 ー 21 ー 1730945627 ー 1768298809 ー 2076119496 ー 514 : 514 : Admins : S ー 1 ー 5 ー 21 ー 1730945627 ー 1768298809 ー 2076119496 ー 512 : 512 : SYSTEM:S—1—5—18:18: Domain Domai11 Domain ntsec を利用する際には、 mkgroup と mkpasswd コ マンドで作成した /etc/passwd と /etc/group が必で ある。これらのファイルの一部を図 5 に示す。ューサー の GCOS フィーノレドと、グループのノヾスワード・フィー ルドに言当されている、、 S ー " て始まる数字の列は、セキュ リティ識別子 (SID) である。 Windows NT / 2000 では、ユーザーやグルーフが名前 ではなく SID で識別される。 ntsec は UNIX のアクセ ス権限をエミュレーションするために、 /etc/passwd と /etc/group を使って SID と uid/gid 間の相圧変換をお こなっている。 uid と gid として用いられる数字は、デ フォルトでは SID の最後の要素の相対識別子である。 /etc/passwd と /etc/group を作りなおす 連載の第 1 回 ( 2000 年 12 月号 ) でも説明したように これらのファイルは Cygw ⅲのインストーラによって生 成される。しかし、 Active Directory や NT ドメイン のアカウントに対応するエントリは生成されないので、必 要ならインストール後に生成しなおさなけれはならない。 ntsec を利用するには、 /etc/passwd にグルーフに対応 するエントリを追加する必要があるので、いすれにせよ /etc/passwd は生成しなおさなけ川まならない。 Windows NT / 2000 では、グループがファイルの所 有者になることがある。たとえは、 Windows のシステム ntsec を利用するためのお膳立てから説明しよう。 ntsec のための準備 UNIX MAGAZINE 2001.6 ( 誌面の都合上、で折り返しています。以下同様 ) 図 6 mkpasswd コマンド吏い方 mkpasswd [ オプション ] [ ドメイン名 ] mkgroup コマンドの使い方 ( デフォルトは /home) -p くパス名 > : ホーム・ディレクトリの親ディレクトリ -s : SID を出力しない させない -m : ホーム・ディレクトリにマウントテープルを反映 -g : ローカルグルーフのエントリを出力 -d : ドメインユーザーのエントリを出力 ー 1 : ローカルューサーのエントリを出力 図 7 117 2 Microsoft はこれを付様と言い張っている。 んだ /etc/passwd と /etc/group を生成するには、ドメ ドメインのアカウントをはしめ、必喫帯にをすべて含 は -s を指定してはいけない。 しなけれはならない。もちろん、 ntsec を利用する場合に のいすれかを、 mkgroup には一 1 か -d のいすれかを指定 図 7 に示す。 mkpasswd にはすくなくとも一 1 、 -d 、 -g mkpasswd と mkgroup の使い方を、それぞれ図 6 と も Administrators グループのエントリか必要になる。 これらのファイルを扱う際には、 /etc/passwd のほうに す Administrators グループになるという欠陥 2 もある。 所属するユーサーが作成したファイルの所有者が、かなら ある。 Windows NT には、 Administrators グループに ファイルの大半は、所有者が Administrators グルーフで -s : SID を出力しない -d : ドメイングルーフのエントリを出力 ー 1 : ローカルグルーフのエントリを出力 mkgroup [ オプション ] [ ドメイン名 ]
連載 /lnside Cygwin— SID を用いれは区別は可能だが、 Cygwin DLL の内 部でも、ほとんどの箇所で uid と gid かイ吏われているた め両者の区別がつかない。 uid や gid が重複している場合 には、 /etc/passwd や /etc/group の最初のエントリの SID が用いられるので、ローカルの Administrator の ファイルの所甬 1 者がドメインの Administrator になった り、 Domain Users グルーフのファイルがどのグルーフ のものでもなくなったりする。 この間題を解決するには、 RID か衝突しているアカウ ントの uid や gid を手で修正しなけれはならない。たとえ は、ドメインのすべてのアカウントのⅲ d と gid に 10000 くらいの大きな数字を加えれは、重複は避けられる。 Cygwin DLL 1.3.0 に付属の mkpasswd と mkgroup では、ドメインのエントリを出力するときに最初から uid と gid に 10000 を加えるようになっている。つまり、ド メインの Administrator の uid は 10500 に、 Domain Users の gid は 10513 となり、 /etc/passwd のドメイン のユーザーのグルーフ・フィールドも 10513 になる。 Cyg- win DLL 1.3.0 がリリースされていれば、 /etc/passwd と /etc/group を生成しなおすだけで、 uid や gid が重複 する間題は夬するはずな 重複している名前を変更する ローカルとドメインの Administrator は、 uid だけで なく名前も重複している。ローカルとドメインの双方にア カウントをもっている人は、自分の名前が /etc/passwd で重複することもあるだろう。 前述したように、 Cygwin DLL の内部では uid と gid が用いられているので、ユーザー名か重複していても間題 はないはすだ。しかし現状では、名前が重複しているとフ ロセスのユーサーを正しく設定できなくなるので、すくな くとも /etc/passwd は名前か重複しないように変更する 必要がある。名前が異なりさえす川まいいので、ドメイーン の Administrator を Administrator2 にする不呈度でも かまわない。 もし修正が間に合えば、 Cygwin DLL 1.3.0 ではこの 間題は解消されて、名前の重複が間題になるのは、 chown や chgrp でファイルの所有者やグループを変更するとき だけになるはずだ。このときに重複している名前を使用す ると、 /etc/{passwd,group} て最初にみつかったエント UNIX MAGAZINE 2001.6 図 9 アクセスが拒否されました ; ntsec の問題点 ならなくなるはすだ。 リの SID が用いられる。 アクセスが拒否されました。 ~ $ ctrd /c start h•oge. txt 1 fujieda a ⅲ U ~ $ hoge. txt ~ $ echo hoge > hoge.txt ちらかを明示できるので、名前の重複はそれほど間題には しかし、 uid か gid を使えばど 5 節「 15 10 : 51 hoge. txt ドを実行していたのは、 こうなるのを防ぐためだ。 SheII- リプトで、ファイルに実彳限をケえてから start コマン 第 4 回で紹介した start コマンドのためのシェル・スク クセスカ甘巨否されました " と怒られてしまう ( 図 9 ) 。 必要なので、実行権限のないファイルを指定すると、、、ア てくれる。この API に指定するファイルには実行権限が 張子に嬲里づけられたアプリケーションでファイルを開い ァイルを指定すると、 ShellExecute API を使って、拡 コマンドを使うときに困ることになる。このコマンドにフ ると、第 4 回 ( 3 月号 ) でとりあげた Windows の start しかし、調子に乗ってファイルの実行権限を落としてい 行権限を chmod -x で落としてしまえばいい。 ていくはすだ。それでも寺ちが悪ければ、ファイルの実 レクトリからは、不要な実彳雀限の付いたファイルカ鰔っ ntsec を有効にしていれば、 Cygwin て利用しているディ すべてのファイルを実行可能にするようなまねはしない。 ntsec を有効にした Cygwin のアフリケーションは、 ルに実行権限がケえられているのは安寺ちが悪すぎる。 はない。しかし UNIX の雀点でみると、すべてのファイ は、 Windows NT / 2000 のイ兼なのでまったく不自然で NTFS 上に作成したファイルに実行権限が与えられるの ァイルに実行権限が与・えられていることに気づくはずだ。 ntsec を有効にするとすぐに、 NTFS 上のすべてのフ ファイルの実行権限が気持ち悪い いう説もあるが・・ 自体が気持ちの悪いものだから、気にしても仕方がないと い現象がいろいろ起こることである。もっとも Cygwin ntsec の間題点は、これを有効にしていると気持ちの悪 119
連載 /lnside Cygwin— 図 1 ntea によるアクセス権限のエミュレー ぐ / ョン ' $ t けー foo; ヨ fco 1 fujieda U ~ $ 灯 + x f«x ヨ 1 fujieda 沼ⅲ U ~ $ export CYGWlNzntea ~ $ c} +X foo; f@ -rwxr-xr-x 1 fuj ieda Cbrnain U ~ $ ( ト町に d og - 「 fm; ヨ fco -rwx--x--x . 1 fuj ie D«nain U ~ $ & 町 u•s fm; fCX) 1 fujieda 〔旧 in U $ d + t fax { - 「お -- x - - 弋 1 fuj ieda [ ⅲ U 0 鮖「 0 「 0 Apr 0 「 0 「 0 「 6 16 : 08 foo 6 16 : 08 fco 6 16 : 08 fcox 6 16 : 08 ま 6 16 : 08 { * 6 16 : 08 fco ま これを避けるには、スタートメニューから bash を起動 するためのバッチファイル (cygwin. bat) か、 Windows のシステム側、 0 羅竟変数を設定する必喫がある。前者の場 合は、以下のように cygwin. bat を書き換えれはよい。 chdir *cygwin*bin SET CYGWIN=ntea bash ——login -i ←挿入 後者の場合には、 Windows NT 4.0 なら、、コントロ ーノレノヾネノレ " →、、システム " →、、環上竟変数 " で、 Windows 2000 なら、、コントロールノヾネル " →、、システム " →、、詳 細 " →、、環境変数 " で、システムかューザーの環境変数と あくまでも見かけ倒しのⅡ tea して CYGWIN を設定すればよい。 UNIX MAGAZINE 2001.6 ファイルの atime か史新されることはなくなる。もう 1 を調べなくなる。このおかげで、 stat を実行するだけで の内容を返すので、ファイルの先頭のマジックナンバー ある。 1 点は、 stat がファイルのモードとして拡張属性 拡張属性を使う方式と従来の方式の違いは 2 点だけで フォルトのエミュレーション方式とまったく同じだ。 と実行権限しかサポートされない仕様は、前回説明したデ イルに所有者とグルーフ。の念がないことや、書込み権限 いる。しかし、これはあくまでも見かけ倒しである。ファ とは set user ID や sticky bit まで操作可能になって 権限の追加すらできなかったのが、 ntea を有効にしたあ で、残りは ntea を有効にして実行している。最初は実行 図 1 では、最初の chmod は ntea を無効にした状態 レーションされているかのようにみえる。 ァイルのアクセス権限が UNIX とまったく同様にエミュ のまま拡彊属性として保存する。そのため見すると、フ 権限を含むファイルのモードを表すビットパターンを、そ カ刻長属性を使ったエミュレーション方式では、アクセス 占は、 access システムコールでファイルが読めるかどう かを検査したときに、ファイルの言ムみ権限を落としてい ると、、読めない " という結果か返ることである。ただしこ れも見かけ倒しで、実際には読めてしまう。 FAT では使いものにならない ntea 拡張属性は Windows NT / 2000 でサポートされてい ると述べたが、実用上間題なく利用できるのは、ファイル システムが NTFS の場合だけである。 FAT32 ではそも そも拡張属性を利用できず、 FAT では使えるもののかな り間題がある。 FAT て拡彊属性を使うと、属生を保存するために、、 EA DATA. SF" というファイルがルート・ディレクトリに作 成される。このファイルは一度作成されると基本的に消す ことができす、消すにはディスクをフォーマットするか、 拡彊属性を理解しない OS を使う必要がある。さらに、 のファイルには、才長生を利用し続けるとしだいに大き くなるという性質もある。 Cygwin ML では、 2GB の FAT?S—ティションの半 分近くを、、 EA DATA. SF " に食われたうえに、消すに消 せないという不幸な列も報告されている。もし、ハ ディスクに FAT のノ、一ティションがあるのなら、 ntea を有効にするのは絶対にやめたほうがいい。 セキュリティ機構の利用 (ntsec) Cygwin DLL がファイルの所有者とグループの概念 をサポートしないのは、どの Windows でも利用できる FAT ファイルシステムの仕様を引きずっているからだ。 NTFS であれば、ファイルごとに所有者とグループを設 定できるし、アクセス権限もき田かく設定できる。 Cyg- win DLL は、 NTFS の機能を使ったアクセス権限の工 ミュレーション方式もサホートしている。この方式は、環 境変数 CYGWIN に、、 ntsec" を設定すると有効になる。 見かけ倒しではない ntsec この方式によるアクセス権限のエミュレーションの例を 図 2 に示す。 ntsec を有効にする前は、すべてのファイ ルの所有者が、、プロセスの所有者 " である僕 (fujieda) に なっていたのが、 ntsec を有効にすると、本来の所有者と アクセス権限が反映されていることが分かる。 115
連載 / ・ /lnside Cygwin— 図 15 所有権の獲彳許可 (Windows 2000 ) 図 14 ファイルの所有者を dareyasore に変更する オブジトー を 名前新新新百丁 - ー アクセス許可 : フォルダの一覧 / データの読み取り 属性の読み取り 拡属性の読み取り ファイルの作成 / データの書き込み フォルダの作成 / データの追加 属性の書き込み 拡張属性の書き込み サプフォルダとファイルの削除 削除 第 アりセス許可の読み取り 所有権の取得 - れらのアクセス = 午可を、この - , テナのこあるオプー上〔型里 - 」 「彡ェクトやコンテ引このみ適用る m 国同ロ、 - OY n 日鑢 h S20 /tnv $ id ui&500(aåninistrator) gid : 513 ( なし ) s : 513 ( なし ) /tnp $ ls ヨ hoge 0 「 18 側 : 23 hoge 1 fujieda す in U /trtp $ れ「 eyaso 代 hoge /tnv $ ヨト e 0 「 18 00 : 23 記 1 「 aso [ 幟 in U /trro $ - ーションする気がないわけではない。そのためのコードは cygwin DLL に入っていて、たんに無効にしてあるだ けだ。 その理由は ntsec と samba の相生の悪さにある。前 述したように、 ntsec は Samba 上のセキュリテイ記述 子を正しく扱えないので、すべてのディレクトリに書込み 権限がないと判断してしまう。そのため、さきのコードを 有効にすると、 samba 上のファイル操作がはとんど Per- mission denied になってしまう。それではあまりにも不 便なのて無効にしてあるのだ。 もっとも、書込み権限や実行権限のないディレクトリ の振舞いを Cygwin でエミュレーションしたとしても、 それが通用するのは Cygwin のアプリケーションだけで ある。 Windows のアプリケーションが、書込み権限のな いディレクトリのファイル名を変えたり、実行権限のな いディレクトリのファイルを開いたりするのは防げないの で、それはど意床があるとは思えない。 所有者を自由に変更できちゃうんですけど 僕はこれはむしろ利点だと思っているのだが、 ntsec を OK 有効にしていると、 Administrator でログオンしている 所有者の変更というべージがあるが、自分以タ ) j 尺肢は ときに、ファイルの所有者やグルーフを思いのままに変 Administrators グループしかなく、任意のユーザーに所 更できてしまう。たとえは図 14 では、 chown て僕のフ 有権を移せるわけではない ( 図 16 ) 。 ァイルの所有者をユーサー dareyasore に変更している。 cygwin の chown が所有者を自山に変更できるのは、 UNIX の雀点でみれば、 root に相当する Administrator ファイルにセキュリテイ記述子を設定するときに、テーフ がファイルの所有者やグループを自山に変更できても、な ストレージからバックアッフをファイルシステムに書き戻 んら不 . 義ではない。 す API を使っているからだ。そのせいで、 NT 4.0 では しかし、 Windows NT / 2000 には所有者を自山に変更 Administrator でなくても chown でファイルの戸斤有者 するという念はない。できるのは、他人のファイルを自 を自山に変更できてしまう。 Windows 2000 は所有者の 分のものにする、、所有権の穫得 " だけだ。ーー搬のユーサー 変更に制限を設けているらしく、 Administrator 権限の は、自分に対する許可の ACE がないと所有権は得でき ないユーサーか所有者を変えようとすると失敗する。 ない ( 図 15 ) 。 Administrator に許されているは、許 さすがに、誰でもファイルの所有者を変更できるのはお 可のないファイルの所有権を得できることだけである。 かしいので、 NT 4.0 でも Cygwin DLL て制限を加える Windows 2000 のアクセスコントロール・エデイタには を 10 のアりセス制設定 OK 図 16 所有者の変更 (Windows 2000 ) アうせス許可ー監査所有者一 このアイテムの現在の所有 研 0 M ロト LAB 挙 d e 所有者の変更 0 : : 名奩 0 A 山れ s Ⅳ 5 ( リ M G2K 第 A 山 0 内 ) dm i 引偽を (UNIMAG2K* 自朝れ m ) UNIX MAGAZINE 2001.6 122
lnside Cygwin 藤枝和宏 UNIX のアクセス権限のエミュレーション この記事力階さんの目に触れるころには Cygwin DLL 1.3.0 がリリースされているはすだ。則回のバージョン 1.1.8 から、 1.2 を飛ひ越して 1.3.0 である。たしかに今回 のバージョンには、Ⅵⅱ ndows のショートカットを使った シンポリック・リンクの実装など、かなり大きな変更が含 まれている。しかし、 1.3.0 というバージョン番号は、そ んなこととはまったく関係のない理由で付けられている。 このバージョン番号は 1.1.8 の開発中にすでに決まって いた。以前から噂のあった製品版の Cygwin 1.2 がリリー スされそうだったので、 Cygwin 1.2 が出る前にさっさと 1.1.8 をリリースして、次を 1.3.0 にすることにしたため だ。だから、今回のバージョンアッフがバグフィックスだ けだったとしても、バージョン番号は 1.3.0 になっていた はずだ。そうなったとしても、いまごろは Cygw ⅲ 1.2 が 発売されていて、 1.3.0 というバージョン番号はユーサー に自然に受け入れられるはすだった。 ところが、 Cygwin 1.2 の話は立ち消えてしまった。正 確には、 Cygwin 1.2 を一殳ューザー向けにオンラインス トアで売る話がなくなってしまった。 Cygwin 1.2 を入手 するには、 GNUPro という GNU の開発ツールのサポー ト製品を Red Hat から購入するしかない。価格はもっと も安いもので 5 インシデントあたり 1 万ドルで、配布さ れるのは Cygwin DLL と開発ツールだけである。残念 ながら、 1.2 は普通のユーサーには縁のないバージョンに なってしまった。 さて、前回説明した Cygwin DLL によるアクセス権 限のエミュレーション方式には、ファイルに所有者とグ はじめに 114 ループの念がない、書込別限と実行権限しか制御でき ない、 ls —F を実行するだけでファイルの atime か更新 されるといった間題があった。今回はこれらの間題を解消 できる、 Windows NT / 2000 に固有の機能を使った工 ミュレーション方式である ntea と ntsec について説明し よう。 Windows NT / 2000 では、ファイルシステムのもつ サイズや日該リなどの属性とは別に、アプリケーション固有 の属性をファイルやディレクトリに付できる。これを 拡張属性 (Extended Attributes) という。これはもと もと OS/2 の機能で、 OS/2 との親和性を高めるために Windows NT に導入されたものである 1 。 Cygwin DLL は、拡彊属性を使ったアクセス権限のエミュレーション方 式をサポートしており、環境変数 CYGWIN に、、 ntea" を設定するとこの方式か有効になる。 竟変数 CYGWIN の設定方法 ところで、環境変数 CYGWIN の設定を . bashrc など のシェルの設定ファイルでおこなうのは、トラブルのも となのでやめたほうがいい。この環境変数の値が Cygwin DLL に読み込まれるのは、 Cygwin のアプリケーション の起重加で、それも main 関数か呼ばれる前である。シェ ルの設定ファイルはそのあとに読み込まれるので、工韆竟変 数 CYGWIN を設疋してもシェル自身の Cygwin DLL には応央されない。 1 こク韋は、うプログラマー仕・一ト ) 』 (Greg Pascal zachary 著、山羊一一訳日経 BP 出版センター、 1994 を読むとう切、る。 拡張属性を利用する (ntea) UNIX MAGAZINE 2001.6
連載 /lnside Cygwin— 図 8 uid と gid の重複 ・ /etc/passwd /bin/sh Administrator: : 500 : 513 : ・ /etc/group , S ー 1 ー 5 ー 21 ー 2025429265 ー 1353024091 ー 682003330 ー 500 : /home/Administrator: /bin/sh Administrator: : 500 : 513 : , S ー 1 ー 5 ー 21 ー 1730945627 ー 1768298809 ー 2076119496 ー 500 : / home / Admi 取 istrato て : なし : S ー 1 ー 5 ー 21 ー 2025429265 ー 1353024091 ー 682003330 ー 513 : 513 : インのユーザーでログオンして以下のように実行すれはよ Domain Users : S ー 1 ー 5 ー 21 ー 1730945627 ー 1768298809 ー 2076119496 ー 513 : 513 : し ) $ mkpasswd ー 1 —g -d > /etc/passwd $ mkgroup ー 1 -d > /etc/group オフションの ) 仰にとくに意未はない。 ションを指定しても、 mkpasswd は、 1. ローカルのグループ 2. ドメインのユーサー 3. ローカルのユーサー の順に、 mkgroup は、 1. ローカルの 4 幇朱グルーフ 2. ドメインのグルーフ 3. ローカルのグルーフ どの順序でオフ の順にエントリを生成する。この順序にどういう未があ るのかは不明だ。 なお、 /etc/passwd と /etc/group を変更したときに は、 Cygwin のアプリケーションをすべて終了しないと 結果か反映されないのて注意してほしい。理山は第 1 回で 説明したとおり、最初に起動した Cygwin のアプリケー ションが共有メモリにファイルの内容をキャッシュして いて、すべてのアプリケーションカ鮗了するまでその内容 か破棄されないからである。 名前と uid 、 gid を好みに合わせる ntsec を利用しているときには、ユーザーやグルーフを SID て識男けるので、 /etc/passwd や /etc/group の名 前やⅲ d 、 gid のフィールドを変更してもかまわない。た とえは、 Administrator の名則を root に、 uid を 0 に 118 したけれは、 /etc/passwd の Administrator のエント リを以下のように書き換えてもよい。 .9496 ー 500 : : /bin/sh root: : 0 : 513 : , S ー 1 ー 5 ー 21 ー 1730. ただし書き換える際には、 uid か gid がほかのエントリ とぶつからないようにしなけれはならない。上の例では、 root の uid を 0 にすると Everyone の uid とふつかる ( 図 5 の /etc/passwd 参照 ) 。これを避けるには、 Every- one の uid を変更するか、 Everyone 自体を削除する必 要がある。原則として Administrators 以外のグループ か所有者になることはないので、その他のグループを / etc /passwd から削除してもとくに間題はない。 ドメインを利用する際の注意事項 現状では、 mkpasswd と mkgroup に一 1 と—d の両方 を指定して、ローカルのアカウントとドメインのアカウン トのエントリを生成すると、かならす名前や uid/gid が ふつかってしまう。 重複している uid や gid を変更する mkpasswd と mkgroup が uid と gid として用いて いる相対識別子 (RID) は、 SID の発行元について一意な 数字なので、ローカルの SID とドメインの SID で RID がぶつかることがある。 たとえは、 Administrator の RID はローカルとドメ インのいすれも 500 である。グルーフか設定されていな いことを示すローカルのグループ、、なし " と、ドメインの ューサーがかならす所属するグルーフ Domain Users の RID も両方とも 513 である。結果として、 /etc/passwd で 2 つの Administrator の uid が、 /etc/group で、、な し " と Domain Users の gid か重複することになる ( 図 8 ) 。 UNIX MAGAZINE 2001.6