我嘗試使用ldapsearch(或其他)作爲普通域用戶從linux機器上讀取nTSecurityDescriptor
。如何使用普通的ldap客戶端訪問nTSecurityDescriptor?
尋找其他的東西的作品,但我找不到nTSecurityDescriptor
。
This KB可能是相關的,但作爲域管理員運行不是服務的選項。
那麼我該如何讀取這些信息呢?我知道我可以閱讀DACL,但問題是如何。
我嘗試使用ldapsearch(或其他)作爲普通域用戶從linux機器上讀取nTSecurityDescriptor
。如何使用普通的ldap客戶端訪問nTSecurityDescriptor?
尋找其他的東西的作品,但我找不到nTSecurityDescriptor
。
This KB可能是相關的,但作爲域管理員運行不是服務的選項。
那麼我該如何讀取這些信息呢?我知道我可以閱讀DACL,但問題是如何。
要選擇ntSecurityDescriptor
,因爲你需要使用LDAP_SERVER_SD_FLAGS_OID
服務器控件與值7表示要在安全描述符減去SACL的所有部分非特權帳戶。默認值(包括SACL)似乎是導致該屬性不被返回的原因,因爲大多數非特權帳戶將無法訪問SACL,並且由於此AD似乎只是不返回任何內容。
在該問題/答案更多細節:
Selecting the AD ntSecurityDescriptor Attribute as a Non-Admin
看起來,這是不可能的。
不幸的是,微軟產品使用的基礎API(COM API等)不是開源的,所以我甚至不知道它是如何完成的。
但是我可以在Windows上通過windows API調用GetSecurityInfo
獲得安全描述符。
我爲Windows ntSecurityDescriptor管理創建了一個新的Java(JNDI)庫(Apache2許可證)。開始閱讀http://blog.tirasa.net/ntsecuritydescripto-management.html進行介紹。
看看圖書館(https://github.com/Tirasa/ADSDDL)集成測試的任何幫助。 以下示例將'user can not change password'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);
// .....
雖然這個鏈接可能回答這個問題,但最好在這裏包含答案的基本部分,並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 – Jave 2015-01-16 09:57:20
我剛剛列入答案的重要部分。 – 2015-01-16 12:13:52
的'ntSecurityDescriptor'的格式在大詳細描述如下的安全描述符部2.4的MS-DTYP開放規範文檔的一部分,並且其小節。面臨的挑戰是將其轉化爲實際可以對結構進行解碼的代碼,因爲它不是微軟在開源世界提供的庫。 Fabio Martelli創建並在他的回答中引用的庫對於嘗試自己實現的人來說是一個很好的參考。 – ChadSikorra 2016-11-15 16:03:43
問題是我如何獲得二進制數據塊。我有什麼要發送到LDAP服務器? – 2016-11-16 04:49:48
它似乎要以非管理員身份檢索值,您需要設置'LDAP_SERVER_SD_FLAGS_OID'服務器控件。有關該控件的一些信息,請參閱:https://msdn.microsoft.com/en-us/library/cc223323.aspx。看起來,控制是在管理用戶下運行,但不是在普通賬戶下運行。不過,我還沒有測試過這個。 – ChadSikorra 2016-11-16 15:08:18