AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 122954
In Process
Matthew Rankin
Matthew Rankin
Asked: 2010-03-17 05:53:50 +0800 CST2010-03-17 05:53:50 +0800 CST 2010-03-17 05:53:50 +0800 CST

通过 Python 脚本/非交互方​​式更改用户密码的安全方法

  • 772

问题

  1. 是否有更安全/更好的方式通过 Python 脚本以非交互方式设置用户密码?我当前的解决方案使用chpasswdFabric脚本。另一种选择是在Fabric脚本中使用Pexpect 。
  2. 我当前设置密码的方法是否存在安全问题?我看到的潜在安全问题是密码在我的本地终端上显示为明文,如下所示
    [xxx.xx.xx.xxx] run: echo "johnsmith:supersecretpassw0rd" | chpasswd:
    由于我只在笔记本电脑上运行Fabric脚本,我认为这不是安全问题,但我对其他人的输入感兴趣。

背景

我使用Fabric创建了一个 Python 脚本来配置一个新构建的Slicehost Ubuntu 切片。如果您不熟悉 Fabric,它使用Python SSH2 客户端Paramiko来提供“用于应用程序部署或系统管理任务”的远程访问。

我让Fabric脚本做的第一件事就是创建一个新的管理员用户并设置他们的密码。与Pexpect不同,Fabric 无法处理远程系统上的交互命令,因此我需要以非交互方式设置用户密码。目前,我正在使用chpasswd命令,它将用户名和密码读取为明文。

当前代码

# Fabric imports and host configuration excluded for brevity
root_password = getpass.getpass("Root's password given by SliceManager: ")
admin_username = prompt("Enter a username for the admin user to create: ")
admin_password = getpass.getpass("Enter a password for the admin user: ")
env.user = 'root'
env.password = root_password
# Create the admin group and add it to the sudoers file
admin_group = 'admin'
run('addgroup {group}'.format(group=admin_group))
run('echo "%{group} ALL=(ALL) ALL" >> /etc/sudoers'.format(
    group=admin_group)
)
# Create the new admin user (default group=username); add to admin group
run('adduser {username} --disabled-password --gecos ""'.format(
    username=admin_username)
)
run('adduser {username} {group}'.format(
    username=admin_username,
    group=admin_group)
)
# Set the password for the new admin user
run('echo "{username}:{password}" | chpasswd'.format(
    username=admin_username,
    password=admin_password)
)

本地系统终端 I/O

$ fab config_rebuilt_slice
Root's password given by SliceManager: 
Enter a username for the admin user to create: johnsmith
Enter a password for the admin user: 
[xxx.xx.xx.xxx] run: addgroup admin
[xxx.xx.xx.xxx] out: Adding group `admin' (GID 1000) ...
[xxx.xx.xx.xxx] out: Done.
[xxx.xx.xx.xxx] run: echo "%admin ALL=(ALL) ALL" >> /etc/sudoers
[xxx.xx.xx.xxx] run: adduser johnsmith --disabled-password --gecos ""
[xxx.xx.xx.xxx] out: Adding user `johnsmith' ...
[xxx.xx.xx.xxx] out: Adding new group `johnsmith' (1001) ...
[xxx.xx.xx.xxx] out: Adding new user `johnsmith' (1000) with group `johnsmith' ...
[xxx.xx.xx.xxx] out: Creating home directory `/home/johnsmith' ...
[xxx.xx.xx.xxx] out: Copying files from `/etc/skel' ...
[xxx.xx.xx.xxx] run: adduser johnsmith admin
[xxx.xx.xx.xxx] out: Adding user `johnsmith' to group `admin' ...
[xxx.xx.xx.xxx] out: Adding user johnsmith to group admin
[xxx.xx.xx.xxx] out: Done.
[xxx.xx.xx.xxx] run: echo "johnsmith:supersecretpassw0rd" | chpasswd
[xxx.xx.xx.xxx] run: passwd --lock root
[xxx.xx.xx.xxx] out: passwd: password expiry information changed.

Done.
Disconnecting from [email protected]... done.
scripting python automation fabric
  • 5 5 个回答
  • 15541 Views

5 个回答

  • Voted
  1. Jacek Konieczny
    2010-03-18T04:54:52+08:002010-03-18T04:54:52+08:00

    您在正在执行的命令行中传递密码。这些可能不仅在您的终端中可见,而且在其他用户发出“ps”命令时也可见(这可能取决于系统配置)。并且密码是纯文本。

    我不知道 Fabric,但如果它让你有可能通过他们的标准输入/标准输出(如subprocess.Popen())与执行的命令进行通信,那么使用它而不是 'echo username:password|... 可能是一个更好的选择。 '。

    此外,您可以选择在 Python 脚本中创建密码哈希(使用crypt模块和“$1$XXXXXXXX$”(“X”是随机字符)盐)并将其传递给chpasswd -e. 那时将永远不会显示或记录纯文本密码。

    您使用模块生成密码哈希,crypt如下所示:

    import crypt
    p='secretpassword'
    print(crypt.crypt(p))
    

    您可以将输出传递给chpasswd -e这样的:

    `echo 'someusername:passwordhash' | chpasswd -e`
    
    • 3
  2. snk
    2010-03-17T06:07:29+08:002010-03-17T06:07:29+08:00

    对于非交互式密码设置,我通常会生成一个随机密码并将其设置为一个变量,然后将该变量传递给我的命令。我不必对密码有创意,也不必在纯文本文件中留下标准密码。

    这是生成随机密码的活动状态配方。

    就安全性而言,我认为在您自己的终端上打印密码并不是什么大问题(使用随机密码,无论如何您都需要这样,因此您可以记下创建的密码) .

    Fabric 与 ssh 有什么不同吗?-- 大多数通过 ssh 传输的东西无论如何都应该被加密。

    • 2
  3. sabs6488
    2014-08-05T12:34:12+08:002014-08-05T12:34:12+08:00

    如果您在结构中使用 chpasswd,请确保不要使用命令行中的纯文本密码。不仅是显示密码的标准输出,它还将被写入 /var/log/secure。在 Fabric 中,您可以使用

    with hide('running', 'output', 'error'):
         <your task here>
    

    并确保将哈希字符串与 chpasswd 命令一起使用,这样即使在安全日志中,您也不会看到纯文本密码。首先决定要使用的密码,并生成哈希字符串。您可以为此使用 openssl。

    openssl passwd -1
    

    这将提示您输入密码并生成 MD5 哈希。你可以在你的脚本中使用它,如下所示。

    echo "<user>:<MD5-hash>" | chpasswd -e
    

    上述命令中的 -e 标志告诉 chpasswd 密码已加密。

    • 2
  4. Florian Ledermann
    2010-09-30T05:31:38+08:002010-09-30T05:31:38+08:00

    即将发布的 Fabric 1.0 版本(现在可从 git 分支获得)将允许与远程端进行交互会话。

    • 1
  5. Val Neekman
    2010-09-27T08:07:24+08:002010-09-27T08:07:24+08:00

    您可以自动配置您的新切片,然后立即登录并更改密码吗?有时最简单的方法是最好的。

    但或者,您可以在本地生成加密密码,然后继续将加密密码写入 /etc/shadow 文件。这样,您根本不使用纯文本。

    请注意,最初提供初始密码时,您必须信任您的本地系统。

    顺便说一句,您能否制作一份您的自动配置副本,以便我使用它而不是从头开始编写所有内容?目前我正在通过 bash 做所有事情。

    像这样的东西?

    sed 's/^root:.*$/root:$PASSWD:13063::::::/' /etc/shadow > /etc/shadow
    
    • 0

相关问题

  • 知道任何适用于 Windows 的快速可编写脚本的 ftp 客户端吗?[关闭]

  • 如果同一个任务已经在运行,如何防止计划任务运行?

  • 需要从 Batch For 循环中排除特定结果

  • Bash 脚本:要求脚本以 root 身份运行(或使用 sudo)

  • 从命令行删除旧的(非引导)Windows Vista 目录

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve