如何给芹菜足够的权限来运行根文件而不影响安全性?

2024-05-14 16:22:28 发布

您现在位置:Python中文网/ 问答频道 /正文

作为芹菜任务的一部分,我正在运行下面的代码

class HealthCheckIKEV2:
    async def report(self):
        try:
            client = RedisClient()
            proc1 = subprocess.Popen(
                ["sudo", "/usr/sbin/swanctl", "--list-sas"], stdout=subprocess.PIPE
            )
            proc2 = subprocess.Popen(
                ["grep", "INSTALLED"],
                stdin=proc1.stdout,
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE,
            )
            proc3 = subprocess.Popen(
                ["wc", "-l"],
                stdin=proc2.stdout,
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE,
                universal_newlines=True,
            )
            proc1.stdout.close()  # Allow proc1 to receive a SIGPIPE if proc2 exits.
            proc2.stdout.close()  # Allow proc2 to receive a SIGPIPE if proc3 exits.
            out, err = proc3.communicate()
            info = {
                "users": out.rstrip(),
                "timestamp": datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S"),
            }
            client.conn.hset(settings.REDIS_VPN_SUBDOMAIN, mapping=info)

但是芹菜失败,并显示以下错误消息:

Jun 13 08:46:42 de-vpn-1 sudo[2038]:   celery : user NOT in sudoers ; TTY=unknown ; PWD=/home/admin/app ; USER=root ; COMMAND=/usr/sbin/swanctl --list-sas
Jun 13 08:47:42 de-vpn-1 sudo[2045]: pam_unix(sudo:auth): conversation failed

这是因为在这一行中,子流程必须作为sudo运行才能执行/usr/sbin/swanctl

proc1 = subprocess.Popen(
                ["sudo", "/usr/sbin/swanctl", "--list-sas"], stdout=subprocess.PIPE
            )

我的选择是什么?芹菜文档说不要给芹菜用户root访问权。我能做些什么来坚持最佳实践并成功执行此任务

我的一个想法是创建一个新组,并向该组添加rootcelery用户。并将该文件的权限更改为该组。不过听起来有点老套。谢谢


Tags: usrstdoutsudorootlist芹菜subprocesspopen
2条回答

我将把celery用户添加到sudoers文件中,只允许使用所需的命令。使用visudo并添加这些行

celery all = (root) NOPASSWD: /usr/sbin/swanctl  list-sas

NOPASSWD:指令确保linux不会要求密码

注意:这为任何可以控制此用户的人提供了此级别的访问权限

我只需在/usr/sbin/swanctl上设置setuid标志,然后从芹菜中运行它,而不需要sudo

相关问题 更多 >

    热门问题