Um usuário não root executa o jetty pela porta 512, menos a porta 1024

Um usuário não root executa o jetty pela porta 512, menos a porta 1024

O cliente nos pede para criar um usuário não root para executar nosso sistema web que liga a porta 512, menor que 1024. Quando o servidor web(cais) é executado, esta é a exceção:

2013-10-16 14:49:51.406:WARN::failed Server@2c2893ce: java.net.SocketException: Permission denied
2013-10-16 14:49:51.406:WARN::EXCEPTION
java.net.SocketException: Permission denied
        at sun.nio.ch.Net.bind0(Native Method)
        at sun.nio.ch.Net.bind(Net.java:444)
        at sun.nio.ch.Net.bind(Net.java:436)
        at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:214)

Então descobri algumas soluções sobre como o usuário não root vincula a porta menor que 1024, finalmente a solução que usei foi definir "cap_net_bind_service" para java, por set Capabilities, o comando é:

sudo setcap cap_net_bind_service+eip /usr/lib/jvm/jdk1.7.0_25/bin/java

Mas quando eu inicio o jetty novamente, outro erro acontece:

[admin@VPRCEMSUSOFC04 bin]$ ./jetty.sh start
Starting Jetty: /usr/lib/jvm/jdk1.7.0_25/bin/java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory

Mesmo quando executo java -version, também causa uma exceção:

[admin@VPRCEMSUSOFC04 bin]$ java -version
java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory

Mas quando eu faço login com root, tudo bem:

[root@VPRCEMSUSOFC04 etc]# java -version
java version "1.7.0_25"
Java(TM) SE Runtime Environment (build 1.7.0_25-b15)
Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode)

Não consigo entender por que isso aconteceu. Por que existem dois resultados diferentes no usuário root e no usuário não root. Parece que as capacidades definidas impactam isso.

O kernel do Linux é 2.6.32-220.el6.x86_64. O sistema operacional é o Red Hat Enterprise Linux Server versão 6.2 (Santiago).

Responder1

O executável Java depende de um recurso que édesabilitado pelo kernel quando o executável adquire permissões ou capacidades adicionais, como medida de segurança. Se você quiser usar este executável como não-root, você precisará adicionar a localização de libjli.so à configuração do seu carregador, localizada em /etc/ld.so.conf*.

informação relacionada