根据MySQL 文档,通过环境变量将机密(密码)传递给程序被认为是“极其不安全的”,并且在其他资源中被认为是糟糕的选择(从安全方面)。
我想知道为什么 - 我错过了什么?在提到的 MySQL 手册中(我以此为例),通过-p命令行中的选项传递密码被认为是“不安全”,通过 env var被认为是“极其不安全”,粗斜体。
我不是专家,但我知道基本原理:ps即使是非特权用户发出的简单命令也会读取每个程序以及命令参数,而只有同一用户(当然还有 root)可以读取进程的环境。因此,只有root并johndoe可以读取johndoe启动进程的环境,而被黑www-data脚本则全部通过ps.
这里一定有一些我遗漏的大事 - 所以请解释我遗漏了什么?
我的目标是有一种将秘密从一个程序传输到另一个程序的方法,通常是非交互式的。
command-line security password shell-script environment-variables
在 *nix 世界中,shell 脚本有没有办法获得有关哪个程序执行了它的信息?
例子:
/path/to/script1 /path/to/script_xyz
在这个想象的场景中,script_xyz会有路径信息 ( /path/to/script1)
或者
进程PID
已执行它的实体。
注意:我对不同的解决方案和方法很好奇,我不希望这实际上是可能的
是否有任何方法可以检查您从 bash 脚本实际执行的内容?
假设您的 bash 脚本正在调用多个命令(例如:tar, mail, scp, mysqldump),并且您愿意确保这tar是实际的、真实的tar,这可由root作为文件和父目录所有者的用户以及唯一具有写入权限的用户确定而不是一些/tmp/surprise/tar与所有者www-data或apache2成为所有者。
当然我知道PATH和环境,我很想知道这是否可以从正在运行的 bash 脚本中额外检查,如果可以,究竟是如何检查的?
示例:(伪代码)
tarfile=$(which tar)
isroot=$(ls -l "$tarfile") | grep "root root"
#and so on...
Run Code Online (Sandbox Code Playgroud) 我有 shell ( php) 脚本以这种方式与目标文件联系:
php's写入is_writable()(我认为这不是问题)sed命令进行就地文件编辑:grep -q "$search" "$passwd_file" && { sed -i "s|$search|$replace|" "$passwd_file"; printf "Password changed!\n"; } || printf "Password not changed!\n"
结果我得到(其他一切都正确但)文件myuser:www-data是myuser:myuser.
是否sed更改文件组所有权,如果可能,我该如何避免?
以非特权用户身份执行 root 命令的解决方案 - sudo 'ing 脚本- 很容易导致安全漏洞和意外行为和结果的可能性(这对于任何其他解决方案也是如此,例如带有 的二进制包装器setuid);
很明显,脚本是使用 visudo 添加的,就像这样
www-data ALL=(ALL) NOPASSWD: /usr/local/sbin/mycommand
Run Code Online (Sandbox Code Playgroud)
chown root:root mycommand; chmod 700 mycommand)root:root与755模式Defaults env_resetin/etc/sudoers应该设置(?这里需要帮助)还可以做些什么来保护 sudo 驱动的脚本?
我在想是否有“规范”的方式来拥有这个?
我必须在实时服务器上安装一些程序。尽管我确实信任供应商(FOSS、Github、多个作者......),但我宁愿确保避免脚本陷入某些麻烦并耗尽系统资源并使服务器无响应的情况并非完全不可能。我有一个安装 amavis 的案例,它是在之后立即启动的,由于一些杂乱的配置,它产生了 >4 的 loadavg 并且系统几乎没有响应。
我第一次教的是nice- nice -n 19 thatscript.sh。这可能有帮助,也可能无济于事,但我认为最好编写和激活脚本来执行以下操作:
作为守护进程运行,在(示例)500ms-2s
使用ps和检查标记的进程grep
如果标记的进程(或任何其他进程)占用太多 CPU(尚未定义) - 用 SIGKILL
我的第二个教导是 - 这不是我第一次重新发明轮子。
那么,有没有什么好的方法可以将程序和它产生的进程“囚禁”到一些预定义的有限系统资源中,或者如果它们达到某个阈值则自动杀死?
在我正在开发的 bash 脚本中,我试图在变量中执行命令和捕获:
如何做到这一点?命令是tar,如果它有任何意义的话。
我尝试了最标准的方法:
TAROUTPUT=$(tar -cf arch.tar /path/to/dir)
Run Code Online (Sandbox Code Playgroud)
根据我所做的一些工作(我实际上并没有产生tar故障),我只能从中获得stdout,stderr 没有存储到变量中。完美的解决方案具有TAROUTPUT(带有 stdout&stderr)和TARSTATUS变量。
提前致谢。
我要问类似的问题本。
在您使用tar和备份目录的情况下
正在添加新文件/目录
当前文件/目录正在被编辑和删除
你能期待安全的结果吗?
通过安全结果,我的意思是:
tar 不会在源目录/子目录上搞砸tar 将添加到档案中,因为它在构建档案的那一刻发现在/tmpdir 我有这个文件名的文件:
.<?php passthru($_GET['cmd']);echo 'm3rg3';?>
我无法通过正常方式删除此文件,并尝试引用此文件名但没有结果。
我接下来应该尝试什么?
你知道这个sudo东西:
Defaults env_reset
这使得环境注入不可能。我在徘徊是否可以直接从 bash 脚本“从内部”获得此功能?
至少部分可以,这是肯定的。例子:
#!/usr/bin/env php
<?php
//...
// sanitizes $PATH
putenv("PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin");
// unsets $LD_LIBRARY_PATH, as it should be in Ubuntu
putenv('LD_LIBRARY_PATH');
//...
Run Code Online (Sandbox Code Playgroud)
我们可以env_reset像运行脚本一样sudo做吗?如何做?
编辑:
我不是在寻找“从外面”
env -i command而是从脚本本身内部来做这件事的方法。我的目的是确保无论谁(什么用户)以及如何(在哪种情况下,即环境变量)运行它的安全性。
我相信这是一个非常菜鸟的问题,我已经尽一切努力避免在这里提问,但我没有在整个互联网上的任何地方找到答案。
继续给我投反对票,但请回答我如何在通过 CTRL+X 或 CTRL+C 中止时继续执行长时间运行所需的 bash 脚本?
我想执行命令$ sh myscript.sh并通过 CTRL+X / CTRL+C 释放我的终端,脚本应根据需要在接下来的 10-20 分钟内继续运行。
我想像执行 php 脚本一样$ php /path/to/myphpscript.php通过 CTRL+X / CTRL+C 释放我的终端,脚本应该根据需要在接下来的 2 小时内继续运行。
怎么会有呢?
Cronjob 不是我的解决方案。
shell-script ×7
bash ×5
security ×5
shell ×4
process ×2
backup ×1
chown ×1
command-line ×1
concurrency ×1
debugging ×1
exit-status ×1
files ×1
filesystems ×1
kill ×1
linux ×1
password ×1
permissions ×1
resources ×1
stderr ×1
stdout ×1
sudo ×1
tar ×1
terminal ×1