使用 Mongo CSFLE (mongodb-crypt) 时/tmp 安装为 noexec 时出现 java.lang.UnsatisfiedLinkError

标签 java linux mongodb jna mongodb-java

我一直在研究 MongoDB CSFLE(客户端字段级加密),我的 Spring Boot 项目 mongodb-crypt-1.0.1 中有一个依赖项。出于安全原因,在 EC2 上运行的 Ubuntu 16.04 操作系统上将 /tmp 分区挂载为 noexec。应用程序启动失败并显示以下堆栈跟踪:

Caused by: java.lang.UnsatisfiedLinkError: /tmp/jna--851256601/jna10844749069600633969.tmp: /tmp/jna--851256601/jna10844749069600633969.tmp: failed to map segment from shared object
    at java.lang.ClassLoader$NativeLibrary.load0(Native Method) ~[?:?]
    at java.lang.ClassLoader$NativeLibrary.load(ClassLoader.java:2430) ~[?:?]
    at java.lang.ClassLoader$NativeLibrary.loadLibrary(ClassLoader.java:2487) ~[?:?]
    at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:2684) ~[?:?]
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:2617) ~[?:?]
    at java.lang.Runtime.load0(Runtime.java:767) ~[?:?]
    at java.lang.System.load(System.java:1834) ~[?:?]
    at com.sun.jna.Native.loadNativeDispatchLibraryFromClasspath(Native.java:947) ~[jna-4.5.2.jar!/:4.5.2 (b0)]
    at com.sun.jna.Native.loadNativeDispatchLibrary(Native.java:922) ~[jna-4.5.2.jar!/:4.5.2 (b0)]
    at com.sun.jna.Native.<clinit>(Native.java:190) ~[jna-4.5.2.jar!/:4.5.2 (b0)]
    at com.mongodb.crypt.capi.CAPI.<clinit>(CAPI.java:778) ~[mongodb-crypt-1.0.1.jar!/:?]
    at com.mongodb.crypt.capi.MongoCryptImpl.<init>(MongoCryptImpl.java:92) ~[mongodb-crypt-1.0.1.jar!/:?]
    at com.mongodb.crypt.capi.MongoCrypts.create(MongoCrypts.java:36) ~[mongodb-crypt-1.0.1.jar!/:?]
    at com.mongodb.client.internal.Crypts.createCrypt(Crypts.java:35) ~[mongo-java-driver-3.12.3.jar!/:?]
...

/tmp 挂载为 exec 时,应用程序启动得很好。

有没有办法在不使 /tmp 可执行的情况下解决这个问题?

最佳答案

据我所知,加密部分使用 JNA,特别是默认使用它将 libmongocrypt.so 提取到临时目录中。我相信相关文档是https://github.com/java-native-access/jna/blob/master/www/GettingStarted.md .

我建议尝试:

  1. jna.library.path 设置为允许执行的文件系统上的路径(并在那里手动复制 libmongocrypt.so?)。
  2. 如果这不起作用,请尝试手动下载 libmongocrypt.so 并将其放入操作系统无需配置即可加载库的路径中。下载说明应与 Ruby 驱动程序相同,即 here ,使用 libmongocrypt 的 nocrypto 版本。

编辑:jna.tmpdir 根据评论似乎更合适。

关于使用 Mongo CSFLE (mongodb-crypt) 时/tmp 安装为 noexec 时出现 java.lang.UnsatisfiedLinkError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61451914/

相关文章:

c - 休眠小于 1ms

Linux Bash 脚本

linux - 如何递归搜索具有特定扩展名的文件?

mongodb - typeorm mongo db 中的一对一关系

java - while 循环中的 .isDisplayed 条件给出 "Element Not Found Exception"

java - 如何为64位Linux机器编译Hadoop?

node.js - 如何无条件地从MongoDB中的数组中提取所有元素

node.js - 填充 Mongoose 分页

java - 部署 tomcat 应用程序时设置松散?

java - 漏斗分析计算,你会如何计算一个漏斗?