| 
16 | 16 | import org.elasticsearch.entitlement.runtime.policy.PathLookup;  | 
17 | 17 | import org.elasticsearch.entitlement.runtime.policy.Policy;  | 
18 | 18 | import org.elasticsearch.entitlement.runtime.policy.PolicyManager;  | 
19 |  | -import org.elasticsearch.entitlement.runtime.policy.PolicyUtils;  | 
20 |  | -import org.elasticsearch.entitlement.runtime.policy.Scope;  | 
21 |  | -import org.elasticsearch.entitlement.runtime.policy.entitlements.CreateClassLoaderEntitlement;  | 
22 |  | -import org.elasticsearch.entitlement.runtime.policy.entitlements.Entitlement;  | 
23 |  | -import org.elasticsearch.entitlement.runtime.policy.entitlements.ExitVMEntitlement;  | 
24 |  | -import org.elasticsearch.entitlement.runtime.policy.entitlements.FilesEntitlement;  | 
25 |  | -import org.elasticsearch.entitlement.runtime.policy.entitlements.FilesEntitlement.FileData;  | 
26 |  | -import org.elasticsearch.entitlement.runtime.policy.entitlements.InboundNetworkEntitlement;  | 
27 |  | -import org.elasticsearch.entitlement.runtime.policy.entitlements.LoadNativeLibrariesEntitlement;  | 
28 |  | -import org.elasticsearch.entitlement.runtime.policy.entitlements.ManageThreadsEntitlement;  | 
29 |  | -import org.elasticsearch.entitlement.runtime.policy.entitlements.OutboundNetworkEntitlement;  | 
30 |  | -import org.elasticsearch.entitlement.runtime.policy.entitlements.ReadStoreAttributesEntitlement;  | 
31 |  | -import org.elasticsearch.entitlement.runtime.policy.entitlements.SetHttpsConnectionPropertiesEntitlement;  | 
32 |  | -import org.elasticsearch.entitlement.runtime.policy.entitlements.WriteSystemPropertiesEntitlement;  | 
33 | 19 | 
 
  | 
34 | 20 | import java.lang.instrument.Instrumentation;  | 
35 | 21 | import java.lang.reflect.Constructor;  | 
36 | 22 | import java.lang.reflect.InvocationTargetException;  | 
37 |  | -import java.nio.file.Path;  | 
38 |  | -import java.util.ArrayList;  | 
39 |  | -import java.util.Collections;  | 
40 |  | -import java.util.List;  | 
41 | 23 | import java.util.Map;  | 
42 | 24 | import java.util.Set;  | 
43 | 25 | 
 
  | 
44 |  | -import static org.elasticsearch.entitlement.runtime.policy.PathLookup.BaseDir.CONFIG;  | 
45 |  | -import static org.elasticsearch.entitlement.runtime.policy.PathLookup.BaseDir.DATA;  | 
46 |  | -import static org.elasticsearch.entitlement.runtime.policy.PathLookup.BaseDir.LIB;  | 
47 |  | -import static org.elasticsearch.entitlement.runtime.policy.PathLookup.BaseDir.LOGS;  | 
48 |  | -import static org.elasticsearch.entitlement.runtime.policy.PathLookup.BaseDir.MODULES;  | 
49 |  | -import static org.elasticsearch.entitlement.runtime.policy.PathLookup.BaseDir.PLUGINS;  | 
50 |  | -import static org.elasticsearch.entitlement.runtime.policy.PathLookup.BaseDir.SHARED_REPO;  | 
51 |  | -import static org.elasticsearch.entitlement.runtime.policy.Platform.LINUX;  | 
52 |  | -import static org.elasticsearch.entitlement.runtime.policy.entitlements.FilesEntitlement.Mode.READ;  | 
53 |  | -import static org.elasticsearch.entitlement.runtime.policy.entitlements.FilesEntitlement.Mode.READ_WRITE;  | 
54 |  | - | 
55 | 26 | /**  | 
56 | 27 |  * Called by the agent during {@code agentmain} to configure the entitlement system,  | 
57 | 28 |  * instantiate and configure an {@link EntitlementChecker},  | 
@@ -105,151 +76,11 @@ private static PolicyManager createPolicyManager() {  | 
105 | 76 |         Map<String, Policy> pluginPolicies = bootstrapArgs.pluginPolicies();  | 
106 | 77 |         PathLookup pathLookup = bootstrapArgs.pathLookup();  | 
107 | 78 | 
 
  | 
108 |  | -        List<Scope> serverScopes = new ArrayList<>();  | 
109 |  | -        List<FileData> serverModuleFileDatas = new ArrayList<>();  | 
110 |  | -        Collections.addAll(  | 
111 |  | -            serverModuleFileDatas,  | 
112 |  | -            // Base ES directories  | 
113 |  | -            FileData.ofBaseDirPath(PLUGINS, READ),  | 
114 |  | -            FileData.ofBaseDirPath(MODULES, READ),  | 
115 |  | -            FileData.ofBaseDirPath(CONFIG, READ),  | 
116 |  | -            FileData.ofBaseDirPath(LOGS, READ_WRITE),  | 
117 |  | -            FileData.ofBaseDirPath(LIB, READ),  | 
118 |  | -            FileData.ofBaseDirPath(DATA, READ_WRITE),  | 
119 |  | -            FileData.ofBaseDirPath(SHARED_REPO, READ_WRITE),  | 
120 |  | -            // exclusive settings file  | 
121 |  | -            FileData.ofRelativePath(Path.of("operator/settings.json"), CONFIG, READ_WRITE).withExclusive(true),  | 
122 |  | -            // OS release on Linux  | 
123 |  | -            FileData.ofPath(Path.of("/etc/os-release"), READ).withPlatform(LINUX),  | 
124 |  | -            FileData.ofPath(Path.of("/etc/system-release"), READ).withPlatform(LINUX),  | 
125 |  | -            FileData.ofPath(Path.of("/usr/lib/os-release"), READ).withPlatform(LINUX),  | 
126 |  | -            // read max virtual memory areas  | 
127 |  | -            FileData.ofPath(Path.of("/proc/sys/vm/max_map_count"), READ).withPlatform(LINUX),  | 
128 |  | -            FileData.ofPath(Path.of("/proc/meminfo"), READ).withPlatform(LINUX),  | 
129 |  | -            // load averages on Linux  | 
130 |  | -            FileData.ofPath(Path.of("/proc/loadavg"), READ).withPlatform(LINUX),  | 
131 |  | -            // control group stats on Linux. cgroup v2 stats are in an unpredicable  | 
132 |  | -            // location under `/sys/fs/cgroup`, so unfortunately we have to allow  | 
133 |  | -            // read access to the entire directory hierarchy.  | 
134 |  | -            FileData.ofPath(Path.of("/proc/self/cgroup"), READ).withPlatform(LINUX),  | 
135 |  | -            FileData.ofPath(Path.of("/sys/fs/cgroup/"), READ).withPlatform(LINUX),  | 
136 |  | -            // // io stats on Linux  | 
137 |  | -            FileData.ofPath(Path.of("/proc/self/mountinfo"), READ).withPlatform(LINUX),  | 
138 |  | -            FileData.ofPath(Path.of("/proc/diskstats"), READ).withPlatform(LINUX)  | 
139 |  | -        );  | 
140 |  | -        if (pathLookup.pidFile() != null) {  | 
141 |  | -            serverModuleFileDatas.add(FileData.ofPath(pathLookup.pidFile(), READ_WRITE));  | 
142 |  | -        }  | 
143 |  | - | 
144 |  | -        Collections.addAll(  | 
145 |  | -            serverScopes,  | 
146 |  | -            new Scope(  | 
147 |  | -                "org.elasticsearch.base",  | 
148 |  | -                List.of(  | 
149 |  | -                    new CreateClassLoaderEntitlement(),  | 
150 |  | -                    new FilesEntitlement(  | 
151 |  | -                        List.of(  | 
152 |  | -                            // TODO: what in es.base is accessing shared repo?  | 
153 |  | -                            FileData.ofBaseDirPath(SHARED_REPO, READ_WRITE),  | 
154 |  | -                            FileData.ofBaseDirPath(DATA, READ_WRITE)  | 
155 |  | -                        )  | 
156 |  | -                    )  | 
157 |  | -                )  | 
158 |  | -            ),  | 
159 |  | -            new Scope("org.elasticsearch.xcontent", List.of(new CreateClassLoaderEntitlement())),  | 
160 |  | -            new Scope(  | 
161 |  | -                "org.elasticsearch.server",  | 
162 |  | -                List.of(  | 
163 |  | -                    new ExitVMEntitlement(),  | 
164 |  | -                    new ReadStoreAttributesEntitlement(),  | 
165 |  | -                    new CreateClassLoaderEntitlement(),  | 
166 |  | -                    new InboundNetworkEntitlement(),  | 
167 |  | -                    new LoadNativeLibrariesEntitlement(),  | 
168 |  | -                    new ManageThreadsEntitlement(),  | 
169 |  | -                    new FilesEntitlement(serverModuleFileDatas)  | 
170 |  | -                )  | 
171 |  | -            ),  | 
172 |  | -            new Scope("java.desktop", List.of(new LoadNativeLibrariesEntitlement())),  | 
173 |  | -            new Scope("org.apache.httpcomponents.httpclient", List.of(new OutboundNetworkEntitlement())),  | 
174 |  | -            new Scope(  | 
175 |  | -                "org.apache.lucene.core",  | 
176 |  | -                List.of(  | 
177 |  | -                    new LoadNativeLibrariesEntitlement(),  | 
178 |  | -                    new ManageThreadsEntitlement(),  | 
179 |  | -                    new FilesEntitlement(List.of(FileData.ofBaseDirPath(CONFIG, READ), FileData.ofBaseDirPath(DATA, READ_WRITE)))  | 
180 |  | -                )  | 
181 |  | -            ),  | 
182 |  | -            new Scope(  | 
183 |  | -                "org.apache.lucene.misc",  | 
184 |  | -                List.of(new FilesEntitlement(List.of(FileData.ofBaseDirPath(DATA, READ_WRITE))), new ReadStoreAttributesEntitlement())  | 
185 |  | -            ),  | 
186 |  | -            new Scope(  | 
187 |  | -                "org.apache.logging.log4j.core",  | 
188 |  | -                List.of(new ManageThreadsEntitlement(), new FilesEntitlement(List.of(FileData.ofBaseDirPath(LOGS, READ_WRITE))))  | 
189 |  | -            ),  | 
190 |  | -            new Scope(  | 
191 |  | -                "org.elasticsearch.nativeaccess",  | 
192 |  | -                List.of(new LoadNativeLibrariesEntitlement(), new FilesEntitlement(List.of(FileData.ofBaseDirPath(DATA, READ_WRITE))))  | 
193 |  | -            )  | 
194 |  | -        );  | 
195 |  | - | 
196 |  | -        // conditionally add FIPS entitlements if FIPS only functionality is enforced  | 
197 |  | -        if (Booleans.parseBoolean(System.getProperty("org.bouncycastle.fips.approved_only"), false)) {  | 
198 |  | -            // if custom trust store is set, grant read access to its location, otherwise use the default JDK trust store  | 
199 |  | -            String trustStore = System.getProperty("javax.net.ssl.trustStore");  | 
200 |  | -            Path trustStorePath = trustStore != null  | 
201 |  | -                ? Path.of(trustStore)  | 
202 |  | -                : Path.of(System.getProperty("java.home")).resolve("lib/security/jssecacerts");  | 
203 |  | - | 
204 |  | -            Collections.addAll(  | 
205 |  | -                serverScopes,  | 
206 |  | -                new Scope(  | 
207 |  | -                    "org.bouncycastle.fips.tls",  | 
208 |  | -                    List.of(  | 
209 |  | -                        new FilesEntitlement(List.of(FileData.ofPath(trustStorePath, READ))),  | 
210 |  | -                        new ManageThreadsEntitlement(),  | 
211 |  | -                        new OutboundNetworkEntitlement()  | 
212 |  | -                    )  | 
213 |  | -                ),  | 
214 |  | -                new Scope(  | 
215 |  | -                    "org.bouncycastle.fips.core",  | 
216 |  | -                    // read to lib dir is required for checksum validation  | 
217 |  | -                    List.of(new FilesEntitlement(List.of(FileData.ofBaseDirPath(LIB, READ))), new ManageThreadsEntitlement())  | 
218 |  | -                )  | 
219 |  | -            );  | 
220 |  | -        }  | 
221 |  | - | 
222 |  | -        var serverPolicy = new Policy(  | 
223 |  | -            "server",  | 
224 |  | -            bootstrapArgs.serverPolicyPatch() == null  | 
225 |  | -                ? serverScopes  | 
226 |  | -                : PolicyUtils.mergeScopes(serverScopes, bootstrapArgs.serverPolicyPatch().scopes())  | 
227 |  | -        );  | 
228 |  | - | 
229 |  | -        // agents run without a module, so this is a special hack for the apm agent  | 
230 |  | -        // this should be removed once https://github.com/elastic/elasticsearch/issues/109335 is completed  | 
231 |  | -        // See also modules/apm/src/main/plugin-metadata/entitlement-policy.yaml  | 
232 |  | -        List<Entitlement> agentEntitlements = List.of(  | 
233 |  | -            new CreateClassLoaderEntitlement(),  | 
234 |  | -            new ManageThreadsEntitlement(),  | 
235 |  | -            new SetHttpsConnectionPropertiesEntitlement(),  | 
236 |  | -            new OutboundNetworkEntitlement(),  | 
237 |  | -            new WriteSystemPropertiesEntitlement(Set.of("AsyncProfiler.safemode")),  | 
238 |  | -            new LoadNativeLibrariesEntitlement(),  | 
239 |  | -            new FilesEntitlement(  | 
240 |  | -                List.of(  | 
241 |  | -                    FileData.ofBaseDirPath(LOGS, READ_WRITE),  | 
242 |  | -                    FileData.ofPath(Path.of("/proc/meminfo"), READ),  | 
243 |  | -                    FileData.ofPath(Path.of("/sys/fs/cgroup/"), READ)  | 
244 |  | -                )  | 
245 |  | -            )  | 
246 |  | -        );  | 
247 |  | - | 
248 | 79 |         FilesEntitlementsValidation.validate(pluginPolicies, pathLookup);  | 
249 | 80 | 
 
  | 
250 | 81 |         return new PolicyManager(  | 
251 |  | -            serverPolicy,  | 
252 |  | -            agentEntitlements,  | 
 | 82 | +            HardcodedEntitlements.serverPolicy(pathLookup.pidFile(), bootstrapArgs.serverPolicyPatch()),  | 
 | 83 | +            HardcodedEntitlements.agentEntitlements(),  | 
253 | 84 |             pluginPolicies,  | 
254 | 85 |             EntitlementBootstrap.bootstrapArgs().scopeResolver(),  | 
255 | 86 |             EntitlementBootstrap.bootstrapArgs().sourcePaths(),  | 
 | 
0 commit comments