8

NetworkService アカウントがキーにアクセスできるようにプログラムで許可するために、次のコードを使用しています。

var RSA = new RSACryptoServiceProvider(
   new CspParameters() { 
     KeyContainerName = "MyEncryptionKey", 
     Flags = CspProviderFlags.UseExistingKey | CspProviderFlags.UseMachineKeyStore 
});

RSA.CspKeyContainerInfo.CryptoKeySecurity.AddAccessRule(
  new System.Security.AccessControl.CryptoKeyAccessRule(
    new SecurityIdentifier(WellKnownSidType.NetworkServiceSid, null),
    CryptoKeyRights.GenericAll,
    AccessControlType.Allow
  )
);

このコードはエラーなしで実行されますが、キー コンテナーのアクセス許可には影響しません。

ただし、コマンドライン ツール aspnet_regiis を使用して同じことを行うと、完全に機能します。

aspnet_regiis -pa "MyEncryptionKey" "NetworkService"

完全な管理者権限で実行しています。これらの権限で実行していない場合、例外がスローされます。また、最初にキーを作成したユーザーとして実行しています。

キー コンテナには、常に次のアクセス ルールがあります。

S-1-5-18         -> LocalSystem
S-1-5-32-544     -> Administrators
S-1-5-5-0-135377 -> MyUser

aspnet_regiis を使用すると、SID S-1-5-20 がこのリストに追加されます。コードから影響を与えることはできません。

AddAccessRule の代わりに SetAccessRule を使用するだけでなく、sid からセキュリティ識別子を文字列形式で作成しようとしました。

コードからこの ACL リストに実際に影響を与える方法はありますか?

4

2 に答える 2

10

Persistを呼び出していないようです。CryptoKeySecurityに加えた変更は、実際にはすぐには保存されません。Persist(...)実際に変更を保存するには、いずれかの方法を使用する必要があります。

NativeObjectSecurity.Persistメソッド(文字列、AccessControlSections)

これらのAPIは、変更に対してかなり複雑なアプローチに従っているようです。最初にCspParametersを作成し、必要な変更を適用してから、それらのパラメーターからプロバイダーを構築する必要があります。構築により、コンテナの更新が呼び出されます。

var params = new CspParameters
{
     KeyContainerName = "MyEncryptionKey", 
     Flags = CspProviderFlags.UseExistingKey | CspProviderFlags.UseMachineKeyStore    
};

params.CryptoKeySecurity.AddAccessRule(
  new System.Security.AccessControl.CryptoKeyAccessRule(
    new SecurityIdentifier(WellKnownSidType.NetworkServiceSid, null),
    CryptoKeyRights.GenericAll,
    AccessControlType.Allow
  )
);

var RSA = new RSACryptoServiceProvider(params);
于 2010-06-29T16:46:51.207 に答える