|
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