web-dev-qa-db-ja.com

`chmod + x`はcygwinでどのように機能しますか?

Cygwinのwgetを介して実行可能ファイルをダウンロードしたところ、実行できないことがわかりました。

Cygwinで私は得る

$ ./clink_0.4.4_setup.exe
-bash: ./clink_0.4.4_setup.exe: Permission denied

エクスプローラーから実行しようとすると、

Windowsは、指定されたデバイス、パス、またはファイルにアクセスできません。アイテムにアクセスするための適切な権限がない可能性があります。

これは明らかなようです-Linux/Unixでは、私はchmod +x、そして確かにそれはここでも機能します。しかし、Windowsには「実行可能」ビットがないと思いました。 cygwinがそのパーミッションをAlternateData Streamsに保存し、それを実行できないようにすることができると想像できますが、cygwinの外部でこれをどのように強制しますか? (エクスプローラーで)ファイルのプロパティに明らかなものが見つかりません。

4
jdm

どうやって chmod +x cygwinで動作しますか?

これを完全に理解するには、 第3章Cygwin-POSIXアカウント、権限、およびセキュリティの使用allを読む必要があります。

いくつかの抜粋が続きます。


POSIXアカウント、許可、およびセキュリティ

このセクションでは、WindowsセキュリティモデルをCygwinで使用してPOSIXアカウント情報、POSIXのようなアクセス許可を実装する方法、およびWindows認証モデルを使用してcygwinアプリケーションがPOSIXのような方法でユーザーを切り替える方法について説明します。

POSIXのようなファイルとディレクトリのアクセス許可の設定は、デフォルトでaclに設定されているマウントオプション(no)aclによって制御されます。

まず、簡単な概要から始めます。この概要は必然的に短くなければならないことに注意してください。 Windowsセキュリティモデルについて詳しく知りたい場合は、MSDNドキュメントのアクセス制御の記事を参照してください。

POSIXの概念、特にPOSIXセキュリティモデルについてはここでは説明しませんが、読者が理解していることを前提としています。 POSIXセキュリティモデルがわからない場合は、Webで初心者向けのドキュメントを検索してください。

Windowsセキュリティの簡単な概要

Windowsセキュリティモデルでは、ほとんどすべての「オブジェクト」がセキュリティで保護されます。 「オブジェクト」とは、ファイル、プロセス、スレッド、セマフォなどです。

すべてのオブジェクトには、「セキュリティ記述子」(SD)と呼ばれるデータ構造が添付されています。 SDには、オブジェクトにアクセスできるユーザーを制御し、オブジェクトに対して、またはオブジェクトを使用して何を許可するかを決定するために必要なすべての情報が含まれています。オブジェクトのSDは、次の5つの部分で構成されます。

  • このSDのいくつかの側面を制御するフラグ。これについてはここでは説明しません。

  • オブジェクト所有者のSID。

  • オブジェクト所有者グループのSID。

  • 「随意アクセス制御リスト」(DACL)と呼ばれる「アクセス制御エントリ」(ACE)のリスト。

  • 「セキュリティアクセス制御リスト」(SACL)と呼ばれるACEの別のリスト。これは、私たちの目的には関係ありません。ここでは無視します。

すべてのACEには、いわゆる「セキュリティ識別子」(SID)や、後で説明するその他のものが含まれています。最初にSIDについて話しましょう。

SIDは、ユーザー、グループ、コンピューター、およびActive Directory(AD)ドメインの一意の識別子です。 SIDは基本的にPOSIXユーザーID(UID)およびグループID(GID)に相当しますが、複数のマシンまたはドメイン間で一意であるため、より複雑です。 SIDは、複数の数値の構造です。ハイフン文字で区切られた数値フィールドの文字列として、SIDを入力するための便利な規則があります。

.。

ファイルのアクセス許可

NTFSで、マウントポイントにnoaclマウントオプションが指定されていない場合、CygwinはPOSIXシステムと同様にファイルのアクセス許可を設定します。基本的に、これは、一致する所有者とグループのSIDを使用してセキュリティ記述子を定義し、所有者、グループ、およびPOSIXが「その他」と呼ぶものを表す「Everyone」のACEを含むDACLを定義することによって行われます。

POSIXパーミッションモデルをWindowsパーミッションモデルにマップしようとすると、問題が1つだけあります。

特定のPOSIX権限設定を許可しない「正しい」ACLの定義にリークがあります。公式ドキュメントでは、簡単に次のように説明しています。

  • 要求された権限は、ユーザーのすべてのACEと、ユーザーがメンバーになっているすべてのグループに対してチェックされます。これらのユーザーおよびグループに与えられたアクセス許可されたACEのアクセス許可は累積され、結果のセットは、そのオブジェクトに与えられたそのユーザーのアクセス許可のセットになります。

  • ACEの順序は重要です。要求された単一の許可が拒否されるか、要求されたすべての許可が付与されるまで、システムはそれらを順番に読み取ります。この条件が満たされると、読み取りは停止します。それ以降のACEは考慮されません。

  • アクセスが拒否されたACEはすべて、アクセスが許可されたACEの前に置く必要があります。このルールに従ったACLは「正規」と呼ばれます。

最後のルールは、好みまたは正確さの定義であることに注意してください。これは絶対的な要件ではありません。すべてのWindowsカーネルは、ACEの許可と拒否の順序に関係なく、ACLを正しく処理します。 2番目のルールは、ACEを優先順序で取得するように変更されていません。

残念ながら、Windowsエクスプローラのファイルプロパティダイアログのセキュリティタブでは、ACEを読み取る前に、ACEの順序を正規の順序に並べ替える必要があります。神に感謝します。キャンセルボタンを押しても、並べ替え順序は変わりません。しかし、OKを押すことさえ考えないでください...

標準ACLは、POSIX権限の可能な組み合わせをそれぞれ反映することはできません。例:

rw-r-xrw-

さて、これが一致するACLを作成する最初の試みです。ただし、Windowsのアクセス許可にはPOSIXの対応物として3ビットしかないことを前提としています。

UserAllow:   110
GroupAllow:  101
OthersAllow: 110

うーん、許可権が蓄積されているため、グループが実行される可能性があるため、ユーザーが実行する可能性があります。

2回目の試行:

UserDeny:    001
GroupAllow:  101
OthersAllow: 110

これで、ユーザーは読み取りと書き込みはできますが、実行はできません。良いですか?番号!残念ながら、他の人が書くかもしれないので、グループは今書くかもしれません。

3回目の試行:

UserDeny:    001
GroupDeny:   010
GroupAllow:  001
OthersAllow: 110

これで、グループは意図したとおりに書き込むことができなくなりますが、残念ながら、ユーザーも書き込むことができなくなります。この問題はどのように解決する必要がありますか?正規の順序によると、UserAllowはGroupDenyに従う必要がありますが、これがそのように解決されることは決してないことは容易に理解できます。

唯一のチャンス:

UserDeny:    001
UserAllow:   010
GroupDeny:   010
GroupAllow:  001
OthersAllow: 110

繰り返しますが、これは、少なくともWindows XPからServer2012 R2まで)の執筆時点では、Windows NTの既存のすべてのバージョンで機能します。GUIのみが処理できません(または処理できません)。その順序で。

ソース POSIXアカウント、権限、およびセキュリティ


参考文献

3
DavidPostill

Cygwinはファイルパーミッションをエミュレートしようとします。 Windowsには、同様のセキュリティ記述子があります。ディレクトリのトラバース/ファイルの実行は、実際には、任意のユーザーまたはグループに付与または拒否できるアクセス許可です。 [セキュリティ]タブを確認してください。

1
Keilaron