Skip to content

Commit 0161bbc

Browse files
authored
[Test] Handle file permissions for Windows (#32681)
This commit modifies the test to handle file permission tests in windows/dos environments. The test requires access to UserPrincipal and so have modified the plugin-security policy to access user information. Closes#32637
1 parent 293c8a2 commit 0161bbc

File tree

2 files changed

+34
-14
lines changed

2 files changed

+34
-14
lines changed

x-pack/plugin/security/src/main/plugin-metadata/plugin-security.policy

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ grant {
2525
permission java.util.PropertyPermission "sun.security.krb5.debug","write";
2626
permission java.util.PropertyPermission "java.security.debug","write";
2727
permission java.util.PropertyPermission "sun.security.spnego.debug","write";
28+
29+
// needed for kerberos file permission tests to access user information
30+
permission java.lang.RuntimePermission "accessUserInformation";
31+
permission java.lang.RuntimePermission "getFileStoreAttributes";
2832
};
2933

3034
grant codeBase "${codebase.xmlsec-2.0.8.jar}" {

x-pack/plugin/security/src/test/java/org/elasticsearch/xpack/security/authc/kerberos/KerberosRealmTests.java

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,19 @@
2323
import org.ietf.jgss.GSSException;
2424

2525
import java.io.IOException;
26-
import java.nio.ByteBuffer;
27-
import java.nio.channels.SeekableByteChannel;
2826
import java.nio.charset.StandardCharsets;
2927
import java.nio.file.Files;
3028
import java.nio.file.Path;
31-
import java.nio.file.StandardOpenOption;
32-
import java.nio.file.attribute.FileAttribute;
33-
import java.nio.file.attribute.PosixFilePermission;
29+
import java.nio.file.attribute.AclEntry;
30+
import java.nio.file.attribute.AclEntryPermission;
31+
import java.nio.file.attribute.AclEntryType;
32+
import java.nio.file.attribute.AclFileAttributeView;
33+
import java.nio.file.attribute.PosixFileAttributeView;
3434
import java.nio.file.attribute.PosixFilePermissions;
35+
import java.nio.file.attribute.UserPrincipal;
3536
import java.util.Arrays;
36-
import java.util.EnumSet;
37+
import java.util.List;
38+
import java.util.Locale;
3739
import java.util.Set;
3840

3941
import javax.security.auth.login.LoginException;
@@ -112,7 +114,6 @@ public void testKerberosRealmWithInvalidKeytabPathConfigurations() throws IOExce
112114
final String keytabPathCase = randomFrom("keytabPathAsDirectory", "keytabFileDoesNotExist", "keytabPathWithNoReadPermissions");
113115
final String expectedErrorMessage;
114116
final String keytabPath;
115-
final Set<PosixFilePermission> filePerms;
116117
switch (keytabPathCase) {
117118
case "keytabPathAsDirectory":
118119
final String dirName = randomAlphaOfLength(5);
@@ -125,14 +126,29 @@ public void testKerberosRealmWithInvalidKeytabPathConfigurations() throws IOExce
125126
expectedErrorMessage = "configured service key tab file [" + keytabPath + "] does not exist";
126127
break;
127128
case "keytabPathWithNoReadPermissions":
128-
filePerms = PosixFilePermissions.fromString("---------");
129-
final String keytabFileName = randomAlphaOfLength(5) + ".keytab";
130-
final FileAttribute<Set<PosixFilePermission>> fileAttributes = PosixFilePermissions.asFileAttribute(filePerms);
131-
try (SeekableByteChannel byteChannel = Files.newByteChannel(dir.resolve(keytabFileName),
132-
EnumSet.of(StandardOpenOption.CREATE_NEW, StandardOpenOption.WRITE), fileAttributes)) {
133-
byteChannel.write(ByteBuffer.wrap(randomByteArrayOfLength(10)));
129+
final String fileName = randomAlphaOfLength(5);
130+
final Path keytabFilePath = Files.createTempFile(dir, fileName, ".keytab");
131+
Files.write(keytabFilePath, randomAlphaOfLength(5).getBytes(StandardCharsets.UTF_8));
132+
final Set<String> supportedAttributes = keytabFilePath.getFileSystem().supportedFileAttributeViews();
133+
if (supportedAttributes.contains("posix")) {
134+
final PosixFileAttributeView fileAttributeView = Files.getFileAttributeView(keytabFilePath, PosixFileAttributeView.class);
135+
fileAttributeView.setPermissions(PosixFilePermissions.fromString("---------"));
136+
} else if (supportedAttributes.contains("acl")) {
137+
final UserPrincipal principal = Files.getOwner(keytabFilePath);
138+
final AclFileAttributeView view = Files.getFileAttributeView(keytabFilePath, AclFileAttributeView.class);
139+
final AclEntry entry = AclEntry.newBuilder()
140+
.setType(AclEntryType.DENY)
141+
.setPrincipal(principal)
142+
.setPermissions(AclEntryPermission.READ_DATA, AclEntryPermission.READ_ATTRIBUTES).build();
143+
final List<AclEntry> acl = view.getAcl();
144+
acl.add(0, entry);
145+
view.setAcl(acl);
146+
} else {
147+
throw new UnsupportedOperationException(
148+
String.format(Locale.ROOT, "Don't know how to make file [%s] non-readable on a file system with attributes [%s]",
149+
keytabFilePath, supportedAttributes));
134150
}
135-
keytabPath = dir.resolve(keytabFileName).toString();
151+
keytabPath = keytabFilePath.toString();
136152
expectedErrorMessage = "configured service key tab file [" + keytabPath + "] must have read permission";
137153
break;
138154
default:

0 commit comments

Comments
 (0)