python - 如何在不影响安全性的情况下授予 celery 足够的权限来运行根文件?

标签 python celery

我正在运行下面的代码作为 Celery 任务的一部分。

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)
但是 Celery 失败并显示以下错误消息:
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
            )
我在这里有哪些选择? Celery 文档说不要给 celery 用户 root 访问权限。我该怎么做才能坚持最佳实践并成功执行此任务?
我的一个想法是创建一个新组并添加 rootcelery该组的用户。并将该文件的权限更改为该组。虽然听起来有点hacky。谢谢。

最佳答案

我会添加 celery用户到 sudoers文件,唯一允许的命令是需要的命令。使用 visudo并添加这些行

celery all = (root) NOPASSWD: /usr/sbin/swanctl --list-sas
NOPASSWD:指令确保 linux 不会要求输入密码。
注:这为可以控制此用户的任何人提供此级别的访问权限

关于python - 如何在不影响安全性的情况下授予 celery 足够的权限来运行根文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67956531/

相关文章:

python - 带函数返回的 Flask render_template

Python:更改 Pandas Plot 的 xticks 时间

python - 初学者 Python : Format Output

python - Celery Cloudamqp 为每个任务创建新连接

python - 如何 MatPlotLib 绘制两个 DataFrame?

python - 为什么 pandas read_csv 不使用我的 dateparser?

python - 在 Django 1.11 中将 QuerySet 传递给 Celery 任务

azure - 无法在 Azure 应用服务上成功运行 Celery 和 Celery Beat

django - 在没有更多任务要运行后,如何让 celery 死掉?

python - celeryd 已死但 subsys 已锁定