2010-11-19 20 views
2

私はLDAPサーバー用のWebフロントエンド(django)を作成しています。さまざまな種類の権限を持つ人々がいますので、LDAP ACLを設定して、特定の属性を表示または編集するユーザーを制御します。 特定のユーザーが読み取りアクセス権を持っているかどうかを簡単に判別できます。読み取りを試みると、取得した内容が表示されます。 しかし、私は実際にはの前に、読み書きアクセスを区別するためのエレガントな方法がありません。私は実際にいくつかの変更を書き込もうとしています。つまり、ログインしているユーザーが書き込みアクセス権を持っているか、読み取り専用であるかどうかをインターフェイスで明確にしたいと考えています。したがって、ユーザーはできない属性を編集しようとはしません。pythonでldapアクセス権を確認する

唯一のことは、一時的に何らかのダミーを属性に書き込んで、それが成功したかどうかを確認することでした。その場合、元の値が復元され、このユーザーに書き込みアクセス権があることがわかります。この属性を編集可能として表示することができます。 この問題は、ダミーが書き込まれた後、元の値が復元される前にサーバーがクラッシュした場合、LDAPサーバーにダミー値が残っていることです。

私が必要とするのは、スキーマ定義を照会できるような方法でACLを照会する方法です。しかし、それはLDAPによって「禁止されていますか?

アイデア?

アイザック

+0

はあなたを行う(https://www.opends.org)もOpenDSを見ることができますつかいます?どのインタフェース/バインディングを使用してアクセスしますか? – ThomasH

+0

私はopenldap 2.3.32とpython 2.6のldapバインディング(import ldap)を使用しています – Isaac

+0

私は書き込みアクセス権があるかどうかを調べるためにダミーを書く必要はありません。私は書き込みアクセス権がないとエラーになり、読み取りアクセス権があれば何も変更しない、元の値を書き込もうとすることができます。それでも、それほどエレガントではないようです。 – Isaac

答えて

0

OpenLDAPの上のACLは、

EX正規表現でOUおよび/またはDNチェックで編成されています。

access to attrs=userPassword 
    by anonymous auth 
    by self write 
    by dn.base="ou=users_with_userPassword_write_access,dc=myproduct,dc=org" write 
    by dn.exact="cn=manager,dc=myproduct,dc=org" write 
    by * none 

access to * 
    by dn.exact="cn=manager,dc=myproduct,dc=org" write 
    by dn.base="ou=users_with_powerfull_write_access,dc=myproduct,dc=org" write 
    by * none 

だから、については、ログインしているユーザーのDN(whoami_sとpython-ldap)では、ユーザーにいくつかの権限があるかどうかを判断できます。データを書くことができるかどうかをテストする必要はなく、djangoアプリケーションでDNをチェックする関数を実装します。

多分あなたはACLがdinamically生成されていると言っていますか?あなたのコメントについて


あなたのACL ACLを知るために、静的であれば、もっと簡単な方法は、これらのACLを実装するのですPythonの機能を実装することです。私の以前のexempleと:今のところ

W_ACCESS_OU = "ou=users_with_powerfull_write_access,dc=myproduct,dc=org" 
def check_write_access(user_dn): 
    return is_dn_base(W_ACCESS_OU, user_dn) 

、のpython-LDAPはslapd.confののACLを取得することはできません...そして、slapd.confのはどこでも「できるため、(slapd.confのを解析するのは安全ではありません"とシステム上のACL宣言は解析するのが難しいかもしれません)、LDAPバックエンドにデータを書き込もうとすると多くの時間を消費します。

私はこれがあまり満足できるものではないことを知っています。別の解決策は、「サービスユーザ」を使用することです。このユーザーのみがLDAPバックエンドに書き込みアクセス権を持ちます。これは、ACLの書き込み簡素化

:次に

access to * 
    by dn.exact="cn=manager,dc=myproduct,dc=org" write 
    by * none 

を、通常のユーザーには、あなたは承認のフラグを設定します。 アプリケーションは、ログに記録されたユーザーが何かしたいときにフラグをチェックします。このフラグがOKの場合、サービスユーザーはバックエンドにデータを書き込みます。

これは、アプリケーションの1つに導入する戦略です。

どちらの場合も、ACLのチェックはアプリケーションによって行われ、LDAPバックエンドでは行われません。

+0

申し訳ありませんが、私は理解が遅いかもしれませんが、私のDNを知っていれば、どのようにACLについて知ることができますか? ACLはslapd.confに定義されていますが、少なくとも概念的には私のdjangoアプリには不明です。私はdjangoからslapd.confを解析することを提案していますか? – Isaac

+0

あなたの質問に答えるには:私のACLは静的です。それでも私はしばらくの間、いくつかの設定を変更するかもしれないので、私はそれらを定義する単一の場所を持っていたいと思います。 – Isaac

+0

@Isaac、私はより多くの情報で私の答えを完了しました – ohe

0

私は "テスト" approchを試してみたいと思います。キャッシュが遅すぎるかもしれません。 ldapサーバー上でのみACL定義を保持したいのは、サーバーとやりとりする他の方法(cliツールと標準のldapツールがあります)があるためです。インターフェイスは同期してACLを定義し、ACLを定義する場所は1つだけです

関連する問題