6

私はPythonでWindowsサービスを作成しており、キーリングモジュールを使用して、定期的かつ永続的に使用する必要のある資格情報を安全に保存しています。これは、キーリングがローカルシステムのユーザー資格情報を使用してパスワードを保存することを意味します。

私がするのは、2つの基本的なキーリング関数を使用することだけです:get_password(SERVICE_NAME, username, password)set_password(SERVICE_NAME, username)。キーリングを理解し、バックエンドが自動的に構成されることを確認したので、キーリングを事前構成しません。

これをWindowsServer2008以降で実行すると、すべてがスムーズに機能します。しかし、これをWindows Server 2003で実行すると、次の厄介なエラーが発生します。

error: (1312, 'CredWrite', 'A specified logon session does not exist. It may already have been terminated.')

私のサービスを実行するために使用されるローカルシステムユーザーのログオンセッションと関係があると思いますが、それは何かを行うための権限を持っているはずのultra-admin-super-userの形式であると理解したので独特ですそれはシステムに必要です。しかし、ユーザーのログオン資格情報をローカル管理者に変更すると、すべてがスムーズに機能します。

これを機能させるには、サービスの構成を変更する必要がありますか?または、ローカルシステムユーザーのセキュリティポリシーを変更しますか?または、ローカル管理者の資格情報を使用してこのサービスを実行するようにユーザーに依頼する必要がありますか?

4

1 に答える 1

3

Windows Server 2003のローカルシステムユーザーには、資格情報ボールトとも呼ばれる資格情報を保存するWindowsメカニズムにアクセスできないという制限があるようです。

キーリングのWindows用のデフォルトのバックエンドは、この組み込みのWindows Vaultメカニズムを使用することであり、それがWindowsからのこの例外をトリガーするものを作成します。

この問題の解決策は、Win32CryptoKeyringlikesと呼ばれる別のキーリングバックエンドを使用することです。

keyring.set_keyring(keyring.backend.Win32CryptoKeyring())

このバックエンドはWin32CryptographicAPIを使用して資格情報を安全に保存するため、セキュリティ面ではWindowsVaultメカニズムを使用するのと同じくらい安全です。違いは、資格情報が保存される場所だけです。クレデンシャルがどこに保存されているかはわかりませんが、それは私の場合とは無関係であることがわかりました。

このバグは、Windows Server2003でローカルシステムユーザーからWindowsVaultを使用する組み合わせでのみ発生することに注意してください。新しいWindowsバージョンでは、これは完全に正常に機能し、WindowsServer2003の他のユーザーでも完全に機能します。 。

コードにクレデンシャルを保存するための複数の安全なメカニズムを使用せずにクロスプラットフォームになりたい場合は、新しいバージョンのWindowsでバックエンドを使用するWin32CryptoKeyringことも完全にうまく機能します。

于 2012-09-12T11:48:22.457 に答える