2

nTSecurityDescriptor通常のドメイン ユーザーとして ldapsearch (またはその他のもの) を使用して、Linux マシンからを読み取ろうとしました。

他のものを検索しても機能しますが、nTSecurityDescriptor.

この KBはおそらく関連していますが、ドメイン管理者として実行することはサービスのオプションではありません。

では、この情報をどのように読み取ることができますか? DACL を読み取ることができることはわかっていますが、問題はその方法です。

4

3 に答える 3

4

Windows ntSecurityDescriptor 管理用に新しい Java (JNDI) ライブラリ (Apache2 ライセンス) を作成しました。概要については、 http://blog.tirasa.net/ntsecuritydescripto-management.htmlから読み始めてください。

ライブラリ ( https://github.com/Tirasa/ADSDDL ) の統合テストを参照してください。例に従って、「ユーザーはパスワードを変更できません」という ACE を DACL に追加します。

final SearchControls controls = new SearchControls();
controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
controls.setReturningAttributes(new String[] { "nTSecurityDescriptor" });

ctx.setRequestControls(new Control[] { new SDFlagsControl(0x00000004) });

NamingEnumeration<SearchResult> results = 
    ctx.search(baseContext, searchFilter, controls);

SearchResult res = results.next();
final String dn = res.getNameInNamespace();

byte[] orig = (byte[]) res.getAttributes().get("nTSecurityDescriptor").get();

SDDL sddl = new SDDL(orig);
results.close();

final List<ACE> toBeChanged = new ArrayList<>();

for (ACE ace : sddl.getDacl().getAces()) {
    if ((ace.getType() == AceType.ACCESS_ALLOWED_OBJECT_ACE_TYPE
       || ace.getType() == AceType.ACCESS_DENIED_OBJECT_ACE_TYPE)
       && ace.getObjectFlags().getFlags().contains(
                 AceObjectFlags.Flag.ACE_OBJECT_TYPE_PRESENT)) {
        if (GUID.getGuidAsString(ace.getObjectType()).equals(
                     UCP_OBJECT_GUID)) {

            final SID sid = ace.getSid();
            if (sid.getSubAuthorities().size() == 1
                && ((Arrays.equals(sid.getIdentifierAuthority(), 
                   new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 })
                && Arrays.equals(sid.getSubAuthorities().get(0), 
                   new byte[] { 0x00, 0x00, 0x00, 0x00 }))
                || (Arrays.equals(sid.getIdentifierAuthority(), 
                   new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x05 })
                 && Arrays.equals(sid.getSubAuthorities().get(0), 
                   new byte[] { 0x00, 0x00, 0x00, 0x0a })))) {
                toBeChanged.add(ace);
            }
        }
    }
}

if (toBeChanged.isEmpty()) {
    // prepare aces
    ACE self = ACE.newInstance(AceType.ACCESS_DENIED_OBJECT_ACE_TYPE);
    self.setObjectFlags(new AceObjectFlags(
                AceObjectFlags.Flag.ACE_OBJECT_TYPE_PRESENT));
    self.setObjectType(GUID.getGuidAsByteArray(UCP_OBJECT_GUID));
    self.setRights(new AceRights().addOjectRight(AceRights.ObjectRight.CR));
    SID sd = SID.newInstance(NumberFacility.getBytes(0x000000000001));
    sd.addSubAuthority(NumberFacility.getBytes(0));
    self.setSid(sd);

    ACE all = ACE.newInstance(AceType.ACCESS_DENIED_OBJECT_ACE_TYPE);
    all.setObjectFlags(new AceObjectFlags(
                AceObjectFlags.Flag.ACE_OBJECT_TYPE_PRESENT));
    all.setObjectType(GUID.getGuidAsByteArray(UCP_OBJECT_GUID));
    all.setRights(new AceRights().addOjectRight(AceRights.ObjectRight.CR));
    sd = SID.newInstance(NumberFacility.getBytes(0x000000000005));
    sd.addSubAuthority(NumberFacility.getBytes(0x0A));
    all.setSid(sd);

    sddl.getDacl().getAces().add(self);
    sddl.getDacl().getAces().add(all);
} else {
    for (ACE ace : toBeChanged) {
        ace.setType(AceType.ACCESS_DENIED_OBJECT_ACE_TYPE);
    }
}

final Attribute ntSecurityDescriptor = new BasicAttribute(
      "ntSecurityDescriptor", sddl.toByteArray());

final ModificationItem[] mods = new ModificationItem[1];
mods[0] = new ModificationItem(
      DirContext.REPLACE_ATTRIBUTE, ntSecurityDescriptor);

ctx.modifyAttributes(dn, mods);
// .....
于 2015-01-16T09:33:11.437 に答える
3

ntSecurityDescriptorを非特権アカウントとして選択するにはLDAP_SERVER_SD_FLAGS_OID、値 7 でサーバー コントロールを使用する必要があります。これは、セキュリティ記述子のすべての部分から SACL を除いたものが必要であることを示します。ほとんどの非特権アカウントは SACL にアクセスできず、この AD のために何も返さないように見えるため、デフォルト値 (SACL を含む) が原因で属性が返されないようです。

この質問/回答の詳細:

AD ntSecurityDescriptor 属性を非管理者として選択する

于 2016-11-23T21:04:21.280 に答える
2

どう見ても無理です。

残念ながら、Microsoft 製品が使用する基本的な API (COM API など) はオープン ソースではないため、それをどのように行うことができるかさえわかりません。

しかし、Windows で Windows API 呼び出しGetSecurityInfoを使用してセキュリティ記述子を取得できます。

于 2013-12-16T00:40:46.347 に答える