Centos7服务器配置笔记-3 root权限设置

Centos7服务器配置笔记-3 root权限设置

简述

服务器一般都建议禁用远程root。但是阿里云的终端和putty比差距真的是蛮大的,各类虚拟机的终端其实也好不到哪里去。所以我采用了限定IP+密钥认证方式允许远程root(上一篇通过sshd_config配置实现此功能)。

服务器一般也都建议日常操作尽量不要使用root,替代的方法是在需要时使用su或sudo临时获取root权限。我在配置时做了一定权衡后最终选择了使用sudo来控制root权限。下文简单描述了选择的原因及简单的配置。可能有很多想法不一定准确,欢迎讨论。

选择sudo的原因

我在参考了网上一些资料后,总体感觉从安全性角度来讲,直接用root并不是最不安全的。下面是我个人理解安全性由低到高

全授权的sudo≤使用默认配置的su<直接root<定制配置的sudo、定制配置的su。

  • 全授权的sudo是在sudoer文件里权限项配置为ALL,那么该普通用户理论上可以做root可以做的任何事情,而且还不需要root用户口令,如果该用户的登录口令是弱口令,那真是比不上限IP、强口令的root直接登录了。
  • 默认的su好一点,至少你要知道root口令才能切换到root身份。但是默认配置里是没有限制口令最大尝试次数的;另外一个比较麻烦的地方是必须把口令告诉需要用su的用户,而且对方一旦用su切换赋予root后,做的任何操作,你都无法控制。
  • 直接root登录,其实安全性较上面两者是要高不少的,存在的问题也是你的口令得告诉普通用户。
  • 定制配置的su指的是在pam配置里加授权用户限制(开启wheel组)和添加防暴力破解(这块没试过,可能可以通过 pam_tally2模块来达成),安全性上应该会有很大提升,但是问题也是root口令外泄。
  • 定制配置的sudo,可以做到权限精确控制,root口令不外泄,唯一的问题是配置是会比较麻烦

系统配置

禁用su

禁用su有两类方法,第一种直接将su文件属性改成700,则其他用户将无权运行该文件了(默认su文件属性为-rwsr-xr-x)。

第二种方法是启用wheel用户组。具体如下:

  • 修改 /etc/pam.d/su文件,找到文件中下面这行,去掉注释,让其生效
#auth required /lib/security/$ISA/pam_wheel.so use_uid
  • 修改 /etc/login.defs文件,在文件最后添加一行:
SU_WHEEL_ONLY yes

比较简单的操作是 echo “SU_WHEEL_ONLY yes” >> /etc/login.defs

如果wheel组不添加任何用户,那么也只有root才能使用su命令了。

配置sudo

sudo配置主要通过修改sudoer来实现。这个文件属性比较特殊,一般修改这个文件都是使用visudo命令,可以省去很多麻烦,还能帮你检测配置是否有语法错误。
sudoer详细解释可参考《Linux中sudo的用法和sudoers配置详解》

#...
#.......省略若干行
#....  
## Command Aliases
## These are groups of related commands...
## Networking  去掉原有注释,让 Cmnd_Alias 生效,后面要用到
 Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool,  /usr/sbin/ip
## Installation and management of software 去掉原有注释,让 Cmnd_Alias 生效,后面要用到
 Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum
## Services 去掉原有注释,让 Cmnd_Alias 生效,后面要用到
 Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig, /usr/bin/systemctl start, /usr/bin/systemctl stop, /usr/bin/systemctl reload, /usr/bin/systemctl restart, /usr/bin/systemctl status, /usr/bin/systemctl enable, /usr/bin/systemctl disable
## Updating the locate database 去掉原有注释,让 Cmnd_Alias 生效,后面要用到
 Cmnd_Alias LOCATE = /usr/bin/updatedb
## Storage 去掉原有注释,让 Cmnd_Alias 生效,后面要用到
 Cmnd_Alias STORAGE = /sbin/fdisk, /sbin/sfdisk, /sbin/parted, /sbin/partprobe, /bin/mount, /bin/umount
## Delegating permissions 这个权限非常大,建议别去掉注释
# Cmnd_Alias DELEGATING = /usr/sbin/visudo, /bin/chown, /bin/chmod, /bin/chgrp

## Processes 去掉原有注释,让 Cmnd_Alias 生效,后面要用到
 Cmnd_Alias PROCESSES = /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall

## Drivers 去掉原有注释,让 Cmnd_Alias 生效,后面要用到
 Cmnd_Alias DRIVERS = /sbin/modprobe


## Manager USER Lower privilege level 这行自己添加的,用来管理普通用户,最多能将用户提升到admin组

 Cmnd_Alias MANAGE_USER =  /usr/sbin/ingroup, /usr/sbin/outgroup, /usr/sbin/adduser2

#...
#.......省略若干行
#....  

## Next comes the main part: which users can run what software on
## which machines (the sudoers file can be shared between multiple
## systems).
## Syntax:
##
##      user    MACHINE=COMMANDS
##
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere

#都root么,自然是想干啥就干啥了,这行也不用控制了
root    ALL=(ALL)       ALL  

#下面这行是新增的,格式如下 某个用户或组 拥有 所有主机=(所有用户) 权限列表
#所以下面这行的含义就是admin组  拥有 所有主机 以所有可能用户 执行NETWORKING, SOFTWARE, SERVICES, STORAGE,  PROCESSES, LOCATE, DRIVERS 命令的权限 
%admin  ALL=(ALL) NETWORKING, SOFTWARE, SERVICES, STORAGE,  PROCESSES, LOCATE, DRIVERS, MANAGE_ADMIN



## 除非是自己玩玩的,否则千万不要设置 ALL=(ALL)  ALL  这比允许用su 还不安全,基本和免密root也就差一口气。    
## Allows people in group wheel to run all commands wheel 组的全注释掉
#%wheel ALL=(ALL)       ALL

## Same thing without a password  wheel 组的全注释掉
# %wheel        ALL=(ALL)       NOPASSWD: ALL

 

上面新增了一个 Manager USER 命令别名,他包含ingroup 和 outgroup ,adduser2三个脚本,主要用来将普通用户添加到admin组里(本身在admin组里的用户都可以用sudo运行这几个命令)。三个脚本大致如下(可能严谨性不够):

ingroup

#!/bin/bash
### ingroup
if [ $# != 2 ] ; then
echo
echo "PARAM NUM IS ERROR:$#"
echo "USAGE: $0 USERNAME GROUPNAME"
echo "NOTE:Group name can only admin,ssh-users"
exit 1;
fi
if [ "$2" == "admin" -o "$2" == "ssh-users" ] ; then
 /usr/sbin/usermod  -a -G $2 $1
else
 echo "!!!!"
 echo "  USAGE: $0 USERNAME GROUPNAME"
 echo "  NOTE:Group name can only admin,ssh-users"
fi
#/usr/sbin/usermod  -a -G admin $1

 

outgroup

#!/bin/bash
###outgroup
if [ $# != 2 ] ; then
echo
echo "PARAMETER NUM IS ERROR,NEED 2 PARAMETER"
echo "USAGE: $0 USERNAME GROUPNAME"
echo "NOTE:Group name can only admin,ssh-users"
exit 1;
fi
if [ "$2" == "admin" -o "$2" == "ssh-users" ] ; then
 /usr/bin/gpasswd -d $1 $2
else
 echo "!!!!"
 echo "  USAGE: $0 USERNAME GROUPNAME"
 echo "  NOTE:Group name can only admin,ssh-users"
fi

 

adduser2

#!/bin/bash
###adduser2
if [ $# != 1 ] ; then
echo
echo "PARAMETER NUM ONLY 1"
echo "USAGE: $0 USERNAME "
exit 1;
fi
egrep "^$1" /etc/passwd >& /dev/null
if [ $? -ne 0 ]
then
 /usr/sbin/adduser -m $1
 /usr/bin/passwd $1
else
 echo "User already exists!"
 exit 1
fi

 

 

配置完后新建一个admin组(有sudo权限),一个ssh_users组,允许ssh登录。下面是常用建用户建组命令(需要root权限)。

groupadd admin #添加admin组
adduser user1  #添加一个user1的用户
passwd user1   #修改user1密码
usermod -a -G admin user1  #将user1加入到admin组
gpasswd -d user1 ssh-admin #将user1从admin组中删除


其实后面实际生产环境中并没有用这三个脚本,主要感觉还是不需要做如此复杂的控制,一般还是三类用户,可登录普通用户,可登录wheel组用户,不可登录用户。

 

参考资料

[1].Linux禁止非WHEEL用户使用su命令详解
[2].Linux可插拔认证模块(PAM)的配置文件、工作原理与流程
[2].Linux中sudo的用法和sudoers配置详解

posted @ 2017-12-15 15:18  木刀也是刀  阅读(1278)  评论(0编辑  收藏  举报