【发布时间】:2017-09-29 18:52:59
【问题描述】:
各位程序员,
我正在完成我的学士学位项目,但遇到了一些问题。
我们的目标是创建一个网络应用程序,该应用程序可以操作和修改 WAGO PLC 750-8202(您可以将其想象为某种工业 Raspberry PI)的 I/O,该应用程序运行带有 lighttpd 网络服务器的嵌入式 linux。我制作了一些利用 PLC 提供的 DAL(HAL) 函数的 C 脚本。
现在我想将它与我的网络应用程序/网站链接。我有一个简单的 PHP 页面(忽略按钮,它什么也不做):
<html>
<head>
<title>PHP Test</title>
</head>
<body>
<button value="CLICK ME">CLICK ME</button>
<?php
echo system("kbusdemo1");
?>
</body>
</html>
kbusdemo1 执行但没有正确使用 DAL 提供的功能,它给了我一个错误。如果我以 root 身份运行该脚本,它会完美运行。我发现问题出在 www 用户权限(我的网络服务器 lighttpd 使用),所以我尝试用
编辑 sudoerssudo nano /etc/sudoers
在PLC linux系统中没有实现Visudo,所以我不得不直接打开它。我将其更改为下面发布的代码,但如果我尝试以 lighttpd 用户(使用 su www)运行 C 脚本,它仍然无法正常工作。我做错了什么?
感谢您的建议。
# sudoers file.
#
# This file MUST be edited with the 'visudo' command as root.
#
# See the sudoers man page for the details on how to write a sudoers file.
#
# Host alias specification
# User alias specification
# Cmnd alias specification
# Defaults specification
# Runas alias specification
# User privilege specification
root ALL=(ALL) SETENV: ALL
admin ALL=NOPASSWD: /etc/config-tools/get_user_info user
ALL=NOPASSWD: /etc/config-tools/get_user_info
www ALL=(ALL) NOPASSWD:ALL
# Uncomment to allow people in group wheel to run all commands
# and set environment variables.
# %wheel ALL=(ALL) SETENV: ALL
# Same thing without a password
# %wheel ALL=(ALL) NOPASSWD: SETENV: ALL
# Samples
# %users ALL=/sbin/mount /cdrom,/sbin/umount /cdrom
# %users localhost=/sbin/shutdown -h now
【问题讨论】:
-
我认为您需要查看的问题是为什么
kbusdemo1仅在以root 身份运行时运行。它是否读取(不必要地)由 root 拥有的任何文件。您是否将kbusdemo1编译为 root ? (又没必要了?)或者你写的硬件交互需要root权限? -
硬件交互可能需要root权限。它需要访问 PLC 的内部内存,获取 I/O 模块的值信息并更改它们,所以我认为脚本需要以 root 身份运行。
-
好的,所以现在不要尝试将二进制文件添加到 sudoers 文件中,您可以将文件的所有者更改为
root并尝试为二进制文件设置suid标志。这将允许任何用户以 root 身份运行二进制文件。 -
您可以
chown将二进制文件的所有者更改为root。然后切换到root并运行chmod u+s kbusdemo1。 -
PHP、
system和sudo是制造出色安全漏洞的成分。你应该看看here,了解一些安全问题。