运行Jetty9的setUID功能

时间:2015-06-09 17:05:39

标签: java jetty unsatisfiedlinkerror jetty-9 setuid

我只是尝试以非root用户身份运行Jetty 9,使用setuid功能而没有成功绑定低端口号。 我在start.ini中启用了模块setuid并添加了-Djava.library.path = / opt / jetty / lib / setuid 但是在启动Jetty时我有以下堆栈跟踪:

  

2015-06-09 16:27:27.211:警告:oejx.XmlConfiguration:main:配置错误   在| |   java中的java.lang.reflect.InvocationTargetException   文件:/opt/jetty/etc/jetty-setuid.xml   java.lang.reflect.InvocationTargetException           at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)           at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)           at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)           at java.lang.reflect.Method.invoke(Method.java:606)           在org.eclipse.jetty.start.Main.invokeMain(Main.java:321)           在org.eclipse.jetty.start.Main.start(Main.java:817)           at org.eclipse.jetty.start.Main.main(Main.java:112)引起:java.lang.reflect.InvocationTargetException           at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)           at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)           at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)           at java.lang.reflect.Method.invoke(Method.java:606)           at org.eclipse.jetty.xml.XmlConfiguration $ JettyXmlConfiguration.set(XmlConfiguration.java:479)           at org.eclipse.jetty.xml.XmlConfiguration $ JettyXmlConfiguration.configure(XmlConfiguration.java:411)           在org.eclipse.jetty.xml.XmlConfiguration $ JettyXmlConfiguration.newObj(XmlConfiguration.java:815)           在org.eclipse.jetty.xml.XmlConfiguration $ JettyXmlConfiguration.itemValue(XmlConfiguration.java:1125)           在org.eclipse.jetty.xml.XmlConfiguration $ JettyXmlConfiguration.value(XmlConfiguration.java:1030)           在org.eclipse.jetty.xml.XmlConfiguration $ JettyXmlConfiguration.call(XmlConfiguration.java:721)           at org.eclipse.jetty.xml.XmlConfiguration $ JettyXmlConfiguration.configure(XmlConfiguration.java:417)           at org.eclipse.jetty.xml.XmlConfiguration $ JettyXmlConfiguration.configure(XmlConfiguration.java:354)           在org.eclipse.jetty.xml.XmlConfiguration.configure(XmlConfiguration.java:262)           在org.eclipse.jetty.xml.XmlConfiguration $ 1.run(XmlConfiguration.java:1243)           at java.security.AccessController.doPrivileged(Native Method)           在org.eclipse.jetty.xml.XmlConfiguration.main(XmlConfiguration.java:1174)           ... 7更多引起:java.lang.UnsatisfiedLinkError:org.eclipse.jetty.setuid.SetUID.getpwnam(Ljava / lang / String;)Lorg / eclipse / jetty / setuid / Passwd;           at org.eclipse.jetty.setuid.SetUID.getpwnam(Native Method)           at org.eclipse.jetty.setuid.SetUIDListener.setUsername(SetUIDListener.java:53)           ......还有23个

这是对此错误的唯一引用:

  • dev.eclipse.org/mhonarc/lists/jetty-users/msg01657.html
  • groups.google.com/forum /#!主题/ dropwizard用户/ aap2B_U_QPo

但他们要么停止要么不显示解决方案。 我找到的setuid包的源代码是: https://github.com/jetty-project/codehaus-jetty-project/blob/master/jetty-setuid/modules/java/src/main/java/org/mortbay/setuid/SetUID.java

即使我不能确定这是我正在使用的版本,因为这个版本来自org.mortbay包,而Jetty 9使用的是Eclipse版本。

我尝试在java args(第一个try-catch块)中设置-Djetty.libsetuid.path,要么添加$ PATH变量的路径,要么设置-Djava.library.path(第二个try-catch块)或复制所以到/ lib,最后,保持原样(第三个try-catch块)。在所有情况下我都得到了相同的异常堆栈。 我不能确定Jetty是否找不到so文件或者无法加载它,因为如果我删除了对路径的所有引用(我后面描述的情况),我仍然得到相同的错误消息。 我使用Java7来运行Jetty。

修改 我将以下片段添加到我的一个webapps作为测试问题,因为如果webapp成功,我会知道问题不在于找到共享对象:

SetUID.setgid(1002);
SetUID.setuid(1002);
Passwd pw = SetUID.getpwuid(1002);
System.setProperty("user.name", pw.getPwName());
System.setProperty("user.home", pw.getPwDir());

结果我有相同的UnsatisfiedLinkError。

EDIT2 相反,我尝试了以下内容:

System.load(SetUID.__FILENAME);
SetUID.setgid(1002);

这给我带来了以下错误消息:

  

javax.servlet.ServletException:java.lang.UnsatisfiedLinkError:Native   库/lib/libsetuid.so已经加载到另一个类加载器

因此,我可以得出结论,至少已经加载了库。

1 个答案:

答案 0 :(得分:0)

探索libsetuid文件(nm -D / path / to / the / so),我意识到我使用的是过时的并且与Jetty 9不兼容,这些函数被命名为mortbay:

   root @ root:〜/ #nm -D libsetuid.so --size-sort |减   0000000000000010 T Java_org_mortbay_setuid_SetUID_setgid   0000000000000010 T Java_org_mortbay_setuid_SetUID_setuid   0000000000000015 T Java_org_mortbay_setuid_SetUID_setumask   0000000000000018 T throwNewJavaSecurityException 0000000000000058 T.   throwNewJavaException 000000000000008e T.   Java_org_mortbay_setuid_SetUID_setrlimitnofiles 00000000000000a7 T   getJavaMethodId 00000000000000f5 T.   Java_org_mortbay_setuid_SetUID_getrlimitnofiles 0000000000000102 T   getJavaFieldInt 0000000000000111 T setJavaFieldInt 0000000000000111 T.   setJavaFieldLong 0000000000000121 T setJavaFieldString   00000000000001ba T Java_org_mortbay_setuid_SetUID_getpwuid   00000000000001e5 T Java_org_mortbay_setuid_SetUID_getpwnam   000000000000027e T Java_org_mortbay_setuid_SetUID_getgrgid   000000000000029e T Java_org_mortbay_setuid_SetUID_getgrnam

现在,我正在使用已经在jetty下载中的共享对象,而不是wiki中链接的共享对象。 除此之外,查看setuid模块的代码,我决定在我的java args中使用属性-Djetty.libsetuid.path来指示lib的绝对路径,例如-Djetty.libsetuid.path = / opt /码头/ LIB / setuid.so