我正在编写一个图形java(javaFX)应用程序,它是操作系统上的一种外壳。我目前使用 Java 8 (JDK corretto 8.402)、Debian 12 和 Xfce。问题是我的 Java 应用程序使用sudo
.这些命令被编写sudoers
为NOPASSWD
.事实证明,用户无需密码就可以运行所有这些命令sudo
,这是不安全的。
粗略地说,我需要做到当电脑打开时,用户自动登录并自动启动应用程序。一切都应该是安全的,用户应该拥有非常有限的权限,并且不应该能够执行 Java 应用程序可以执行的命令。
我对Linux不太擅长,所以想听听您的建议。
- 我尝试过创建另一个用户。所以有
root
,user1
和guest
.我们的想法是让会话以 guest 身份运行,应用程序以 user1 身份运行。 - 在
/etc/lightdm/lightdm.conf
我配置了自动登录guest
并在xfce4-session-settings
应用程序中,我配置了一个自动运行脚本以java
作为另一个用户运行应用程序,如下所示:sudo -S -u user1 java -jar /path/to/my.jar
我希望它无需密码即可运行,但随后/usr/bin/java
需要将其添加到 sudoers 中NOPASSWD
。然后事实证明,用户guest
可以运行任何 Java 应用程序sudo
并通过它做任何他想做的事情。
答案1
据我了解,由于您有两个用户,您可以向 user1 授予 NOPASSWD 所有命令,例如user1 ALL=(ALL) NOPASSWD: ALL
甚至仅限于所需的命令,并且 guest 不需要拥有任何 sudoers 权限,或者如果您希望 guest 拥有 sudo 访问权限,请添加行guest ALL=(ALL) ALL
,因此客人必须提供密码。
答案2
这确实是一条评论,但它太长,无法放入框中。
这些命令在 sudoers 中编写为 NOPASSWD。事实证明,用户无需密码就可以使用 sudo 运行所有这些命令,这是不安全的。 ...粗略地说,我需要做到当电脑打开时,用户自动登录
因此,您希望用户无需输入密码即可运行命令,但您也不希望他们无需输入密码即可运行命令。
你的描述是矛盾的。
这个想法是让会话作为访客,应用程序作为 user1 运行
这可能会让事情变得更加复杂。虽然如果“应用程序”作为守护进程运行,则很容易启动,但它无法与用户拥有的屏幕进行交互(无需额外的配置)。 OTOH 如果“应用程序”由用户会话调用,那么您需要某种机制来更改其 uid。
解决问题的最佳方法是配置系统,以便用户可以运行调用预期的操作而无需切换 uid - 但您没有告诉我们任何有关这些的信息。
Sudo(和类似的工具)之所以存在,是因为有一些问题是以前的方法无法解决的。如果您不正确使用它们,它们就不安全。即使是像这样简单的事情:
%support ALL=(ALL) NOPASSWD: less /var/log/maillog
对于 root shell 来说,利用它是微不足道的。
然后事实证明来宾用户可以运行任何 Java 应用程序
因为你的sudo配置不正确。您可以在 sudo 配置行中指定允许的参数以及可执行文件。
就个人而言,我总是将 sudo 目标包装在 shell 脚本中,并将 shell 脚本配置为 sudo 配置中的目标,以避免任何歧义。