文章目录

  • 前言
  • 一、CentOS是什么?
  • 二、CentOS的安全设置
  • 1.注释掉系统不需要的用户和用户组
  • 2.闭系统不需要的服务
  • 3.禁止非root用户执行/etc/rc.d/init.d/下的系统命令
  • 4.给文件加上不可更改属性,从而防止非授权用户获得权限
  • 5.限制不同文件的权限
  • 6.禁止使用Ctrl+Alt+Del快捷键重启服务器
  • 7.使用yum update更新系统时不升级内核,只更新软件包
  • 8.登录密码问题
  • 9.关闭多余的虚拟控制台
  • 10.删除MySQL历史记录
  • 11.修改history命令记录
  • 12.隐藏服务器系统信息
  • 13.优化Linux内核参数
  • 14.CentOS 系统优化
  • 15.防止攻击
  • 16.防火墙设置和端口设置
  • 总结
  • 参考文献



前言

近日因部署项目的原因需要了解CentOS的相关安全设置
我们必须明白:最小的权限+最少的服务=最大的安全
所以,无论是配置任何服务器,我们都必须把不用的服务关闭、把系统权限设置到最小话,这样才能保证服务器最大的安全。

以下是本篇文章正文内容


一、CentOS是什么?

CentOS(Community Enterprise Operating System,中文意思是社区企业操作系统)是Linux发行版之一,它是来自于Red Hat Enterprise Linux依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定性的服务器以CentOS替代商业版的Red Hat Enterprise Linux使用。两者的不同,在于CentOS完全开源。


二、CentOS的安全设置

1.注释掉系统不需要的用户和用户组


注意:不建议直接删除,当你需要某个用户时,自己重新添加会很麻烦。

  • 注释用户
cp  /etc/passwd  /etc/passwdbak   #修改之前先备份(不用备份一时爽,事后误操火葬场。)
   vi /etc/passwd  #编辑用户,在前面加上#注释掉此行 
    #adm:x:3:4:adm:/var/adm:/sbin/nologin
    #lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
	#sync:x:5:0:sync:/sbin:/bin/sync
	#shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
	#halt:x:7:0:halt:/sbin:/sbin/halt
	#operator:x:11:0:operator:/root:/sbin/nologin
	#games:x:12:100:games:/usr/games:/sbin/nologin
	#ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin    #注释掉ftp匿名账号
  • 用户信息解释

六个冒号“:”把文件分成了7列,而每一列代表什么内容呢?

Passwd文件由许多条记录组成,每条记录占一行,记录了一个用户帐号的所有信息。每条记 录由7个字段组成,字段间用冒号“:”隔开。
其格式如下: username:password:User ID:Group ID:comment:home directory:shell

字段含义:

  • .username 用户名
    它唯一地标识了一个用户帐号,用户在登录时使用的就是它。
  • password 该帐号的口令
    passwd文件中存放的密码是经过加密处理的。Linux的加密算法很严密,其中的口令几乎是不可能被破解的。。
  • User ID 用户识别码,简称UID。
    Linux系统内部使用UID来标识用户,而不是用户名。UID是一个整数,用户的UID互不相同。 0是系统管理员账号,1-499是系统保留账号,500+即一般账号
  • Group ID 用户组识别码,简称GID。
    不同的用户可以属于同一个用户组,享有该用户组共有的权限。与UID类似,GID唯一地标识了一个用户组。 用usermod -g 设置
  • comment 这是给用户帐号做的注解
    它一般是用户真实姓名、电话号码、住址等,当然也可以是空的。
  • home directory 主目录
    这个目录属于该帐号,当用户登录后,它就会被置于此目录中,就像回到家一样。一般来说,root帐号的主目录是/root,其他帐号的家目录都在/home目录下,并且和用户名同名。 用usermod -d 设置
  • login command 用户登录后执行的命令
    一般来说,这个命令将启动一个shell程序。例如,用bbs帐号登录后,会直接进入bbs系统,这是因为bbs帐号的login command指向的是bbs程序,等系统登录到bbs时就自动运行这些命令。
  • 系统帐号
    系统中还有一些默认的帐号,如daemon、bin等。这些帐号有着特殊的用途,一般用于进行系统管理。这些帐号的口令大部分用(x)号表示,代表它们不能在登录时使用。
  • 注释用户组
cp /etc/group   /etc/groupbak   #修改之前先备份
  vi /etc/group  #编辑用户组,在前面加上#注释掉此行
	#adm:x:4:
	#lp:x:7:
	#games:x:20:
  • 用户组信息解释
  • 组名
  1. 就是是用户组的名称,有字母或数字构成。同 /etc/passwd 中的用户名一样,组名也不能重复。
  • 组密码
  1. 和 /etc/passwd 文件一样,这里的 “x” 仅仅是密码标识,真正加密后的组密码默认保存在 /etc/gshadow 文件中。
  2. 用户设置密码是为了验证用户的身份,那用户组设置密码是用来做什么的呢?
  3. 用户组密码主要是用来指定组管理员的,由于系统中的账号可能会非常多,root 用户可能没有时间进行用户的组调整,这时可以给用户组指定组管理员,如果有用户需要加入或退出某用户组,可以由该组的组管理员替代 root 进行管理。但是这项功能目前很少使用,我们也很少设置组密码。如果需要赋予某用户调整某个用户组的权限,则可以使用 sudo 命令代替。
  • 组ID (GID)
  1. 就是群组的 ID 号,Linux 系统就是通过 GID 来区分用户组的,同用户名一样,组名也只是为了便于管理员记忆。
  2. 这里的组 GID 与 /etc/passwd 文件中第 4 个字段的 GID 相对应,实际上,/etc/passwd 文件中使用 GID 对应的群组名,就是通过此文件对应得到的。
  • 组中的用户
  1. 此字段列出每个群组包含的所有用户。需要注意的是,如果该用户组是这个用户的初始组,则该用户不会写入这个字段,可以这么理解,该字段显示的用户都是这个用户组的附加用户。
  2. 举个例子,lamp 组的组信息为 lamp:x:502:,可以看到,第四个字段没有写入 lamp 用户,因为 lamp 组是 lamp 用户的初始组。如果要查询这些用户的初始组,则需要先到 /etc/passwd 文件中查看 GID(第四个字段),然后到 /etc/group 文件中比对组名。
  3. 每个用户都可以加入多个附加组,但是只能属于一个初始组。所以我们在实际工作中,如果需要把用户加入其他组,则需要以附加组的形式添加。例如,我们想让 lamp 也加入 root 这个群组,那么只需要在第一行的最后一个字段加入 lamp,即 root:x:0:lamp 就可以了。
  4. 一般情况下,用户的初始组就是在建立用户的同时建立的和用户名相同的组。

2.闭系统不需要的服务

操作如下:

service acpid stop  chkconfig acpid off   #停止服务,取消开机启动       #电源进阶设定,常用在 Laptop 上
 service autofs stop  chkconfig autofs off  #停用自动挂载档桉系统与週边装置
 service bluetooth stop  chkconfig  bluetooth  off   #停用Bluetooth蓝芽
 service cpuspeed stop  chkconfig  cpuspeed  off   #停用控制CPU速度主要用来省电
 service cups stop   chkconfig cups off    #停用 Common UNIX Printing System 使系统支援印表机
 service ip6tables stop  chkconfig ip6tables off   #禁止IPv6

如果要恢复某一个服务,可以执行下面操作

service acpid start  chkconfig acpid on

3.禁止非root用户执行/etc/rc.d/init.d/下的系统命令

所有启动脚本放置在 /etc/rc.d/init.d下

chmod -R 700 /etc/rc.d/init.d/*
 chmod -R 777 /etc/rc.d/init.d/*    #恢复默认设置

4.给文件加上不可更改属性,从而防止非授权用户获得权限

给系统服务端口列表文件加锁,防止未经许可的删除或添加服务

chattr +i /etc/passwd
 chattr +i /etc/shadow
 chattr +i /etc/group
 chattr +i /etc/gshadow
 chattr +i /etc/services    #给系统服务端口列表文件加锁,防止未经许可的删除或添加服务
 lsattr  /etc/passwd   /etc/shadow  /etc/group  /etc/gshadow   /etc/services   #显示文件的属性
  • 注意:执行以上权限修改之后,就无法添加删除用户了。
    如果再要添加删除用户,需要先取消上面的设置,等用户添加删除完成之后,再执行上面的操作
chattr -i /etc/passwd     #取消权限锁定设置
 chattr -i /etc/shadow
 chattr -i /etc/group
 chattr -i /etc/gshadow
 chattr -i /etc/services   #取消系统服务端口列表文件加锁

现在可以进行添加删除用户了,操作完之后再锁定目录文件


5.限制不同文件的权限

700权限表示只有属主才能去操作

chattr +a .bash_history           #避免删除.bash_history或者重定向到/dev/null
chattr +i .bash_history
chmod 700 /usr/bin               恢复  chmod 555 /usr/bin
chmod 700 /bin/ping              恢复  chmod 4755 /bin/ping
chmod 700 /usr/bin/vim           恢复  chmod 755 /usr/bin/vim
chmod 700 /bin/netstat           恢复  chmod 755 /bin/netstat
chmod 700 /usr/bin/tail          恢复  chmod 755 /usr/bin/tail
chmod 700 /usr/bin/less          恢复  chmod 755 /usr/bin/less
chmod 700 /usr/bin/head          恢复  chmod 755 /usr/bin/head
chmod 700 /bin/cat               恢复  chmod 755 /bin/cat
chmod 700 /bin/uname             恢复  chmod 755 /bin/uname
chmod 500 /bin/ps                恢复  chmod 755 /bin/ps

6.禁止使用Ctrl+Alt+Del快捷键重启服务器

操作如下:

cp /etc/inittab  /etc/inittabbak
vi /etc/inittab 
#ca::ctrlaltdel:/sbin/shutdown -t3 -r now

7.使用yum update更新系统时不升级内核,只更新软件包


由于系统与硬件的兼容性问题,有可能升级内核后导致服务器不能正常启动,这是非常可怕的,没有特别的需要,建议不要随意升级内核。

cp /etc/yum.conf    /etc/yum.confbak
1、修改yum的配置文件 vi /etc/yum.conf  在[main]的最后添加 exclude=kernel*
2、直接在yum的命令后面加上如下的参数:
yum --exclude=kernel* update
查看系统版本  cat /etc/issue
查看内核版本  uname -a

8.登录密码问题

  • 设置登录用户无操作超时自动退出
# 针对指定用户设置, 首先进入用户的家目录, 修改 .bash_profile 文件, 300秒;
cd /home/tian
ls -a
    .  ..  .bash_history  .bash_logout  .bash_profile  .bashrc
vim .bash_profile
    ... ...
    export TMOUT=300
    
# 修改 /etc/profile 文件, 全局所有用户生效;
vim /etc/profile
    ... ...
    export TMOUT=300
source /etc/profile   # 声明生效, 或者退出终端重新登录生效;
  • 只允许 root登录, 禁止其他用户登录
#操作步骤: 使用 root 用户在 /etc/ 目录下创建 nologin 文件即可;
vim /etc/nologin        #可为空, 也可以写入登录不上回显提示的内容;
    Sorry, the system is under health examination, please try again in an hour ... ...
    
# 使用用户 tian 登录测试
    Connecting to 192.168.9.27:22...
    Connection established.
    To escape to local shell, press 'Ctrl+Alt+]'.

    Sorry, the system is under health examination, please try again in an hour ... ...
  • 设置同一个用户同时只能一个人登录
#只能针对与非 root 用户
vim /etc/security/limits.conf
... ...
 50 tian             hard    maxlogins       1
 # 用户名                              最大同时连接数
 ... ...
  • 用户锁定
# 使用 root 用户登录后执行解锁命令
# 查看锁定用户信息
pam_tally2 -u tian
    Login           Failures Latest failure     From
    tian                0    
#   用户              失败的次数

# 解锁
pam_tally2 -u tian --reset
  • 锁定长期不使用的账号
# 方法一, 密文前增加 2 个 "!" ; 使用 passwd -u 进行解锁
passwd -l
# 方法二, 密文前增加 1 个 "!" ; 使用 passwd -U 进行解锁; 两次执行可解上面的锁定
usermod -L
# 查看
passwd -S tian
    tian LK 2019-03-20 0 60 7 -1 (Password locked.)        // 已锁定;
  • 设置 允许或禁止 登录的用户
# 修改 ssh 配置文件, 添加 AllowUsers 或者 DenyUsers , 表示 允许登录 或者 拒绝登录;tian hao zeng rong 四个用户都在属于 wheel 组; 
vim /etc/ssh/sshd_config
    #LoginGraceTime 2m                #LoginGraceTime 2m
    PermitRootLogin no                PermitRootLogin no
    AllowUsers zeng rong            DenyUsers tian hao
    #StrictModes yes                #StrictModes yes
    #MaxAuthTries 6                    #MaxAuthTries 6
    #MaxSessions 10                    #MaxSessions 10
# 上面配置文件中左右的配置效果一样;
# 修改sshd配置文件;
vim /etc/ssh/sshd_config
    AllowUsers root@192.168.10.108        #添加此行,允许root用户只能在192.168.10.108登录;
    AllowUsers root@192.168.10.108 admin   # 一行指定多个用户,用空格隔开,允许root用户只能在192.168.10.108登录,允许admin在任何地方登录;
# 以上两行不同时存在,介绍规则,以此类推;
# 重启sshd服务后生效;
[root@localhost ~]# /etc/init.d/sshd restart

#还可以使用 pam 规则控制, 修改 /etc/pam.d/sshd 文件, 第一行添加一下内容, 允许/拒绝登录
vim /etc/pam.d/sshd
    auth required pam_listfile.so item=user sense=allow file=/etc/sshusers onerr=fail
    # 或者
    auth required pam_listfile.so item=user sense=deny file=/etc/sshusers onerr=succeed
    
#在/etc/ 目录下建立 sshusers 文件, 添加用户名, 一行为一个用户;
   # 上面配置文件中若是 allow , 文件中的用户是可以登录的;
    # 上面配置文件中若是 deny, 文件中的用户是不可以登录的;
vim /etc/sshusers
    tian
    zong
  • 命令设置密码有效期( 已存在的用户 )
chage -M 天数 用户名            # 方法一
passwd -x 天数 用户名           # 方法二

# 操作
grep tian /etc/shadow
    tian:!!:17976:0:99999:7:::
chage -M 60 tian
grep tian /etc/shadow
    tian:!!:17976:0:60:7:::
  • 密码定期修改
# 查看用户的定期修改的信息
chage -l tian
    Last password change                    : Mar 21, 2019
    Password expires                    : never
    Password inactive                    : never
    Account expires                        : never
    Minimum number of days between password change        : 0
    Maximum number of days between password change        : 99999
    Number of days of warning before password expires    : 7
    
# 配置用户密码定期修改
vim /etc/login.defs
    ... ...
    MAIL_DIR /var/spool/mail # 当你在创建用户的同时,再/var/spool/mail目录下创建mail文件;
    ... ...
    PASS_MAX_DAYS   90       # 用户密码不过期最多的天数;
    PASS_MIN_DAYS   0        # 密码修改之间的最小天数;
    PASS_MIN_LEN    8        # 密码最小长度;
    PASS_WARN_AGE   7        # 密码过期提前的警告天数;
    ... ...
    UID_MIN                   500   # 此处两行设置创建用户的最小uid和最大uid范围;
    UID_MAX                 60000
    ...    ...
    GID_MIN                   500   # 此处两行是设置GID;
    GID_MAX                 60000
    ... ...
    CREATE_HOME     yes     # 创建用户的时候是否创建家目录;
    UMASK       077         # 家目录的权限初始值;
    ... ...
    USERGROUPS_ENAB yes     # 当一个组只有一个用户存在的时候,删除用户的同时删除组;
    ENCRYPT_METHOD SHA512   # 指定password的机密方法;
    # 要求用户下次登录时修改密码
     chage -d 0 用户名
  • 重设密码5次不能重复
# remember=5 表示 5 次
vim /etc/pam.d/system-auth
    password    sufficient    pam_unix.so sha512 shadow nullok     try_first_pass use_authtok remember=5
  • 登录错误不能超过5次, 超过5次锁定20分钟
# 查看系统中是否含有pam_tally2.so模块
find / -type f -name "pam_tally2.so"

# 修改配置文件, 设置密码错误 5 次, 锁定 20 分钟; 第二行添加以下内容;
vim /etc/pam.d/sshd
    auth   required     pam_tally2.so deny=5 unlock_time=12000

9.关闭多余的虚拟控制台


系统默认定义了 6 个虚拟控制台,关闭多余的控制台,只留一个控制台,可以节省内存,防止从不同的控制台登录

cp  /etc/inittab  /etc/inittabbak
vi /etc/inittab
# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
#2:2345:respawn:/sbin/mingetty tty2
#3:2345:respawn:/sbin/mingetty tty3
#4:2345:respawn:/sbin/mingetty tty4
#5:2345:respawn:/sbin/mingetty tty5
#6:2345:respawn:/sbin/mingetty tty6

10.删除MySQL历史记录

用户登陆数据库后执行的SQL命令也会被MySQL记录在用户目录的.mysql_history文件里。
如果数据库用户用SQL语句修改了数据库密码,也会因.mysql_history文件而泄漏。
所以我们在shell登陆及备份的时候不要在-p后直接加密码,而是在提示后再输入数据库密码。
另外这两个文件我们也应该不让它记录我们的操作,以防万一。

cd
cp .bash_history  .bash_historybak  #备份
cp .mysql_history .mysql_historybak
rm .bash_history .mysql_history
ln -s /dev/null .bash_history
ln -s /dev/null .mysql_history

11.修改history命令记录

操作如下:

cp /etc/profile   /etc/profilebak
vi /etc/profile
找到 HISTSIZE=1000 改为 HISTSIZE=50

12.隐藏服务器系统信息

在缺省情况下,当你登陆到linux系统,它会告诉你该linux发行版的名称、版本、内核版本、服务器的名称。
为了不让这些默认的信息泄露出来,我们要进行下面的操作,让它只显示一个"login:"提示符。
删除/etc/issue和/etc/issue.net这两个文件,或者把这2个文件改名,效果是一样的。

mv  /etc/issue /etc/issuebak
mv  /etc/issue.net   /etc/issue.netbak

13.优化Linux内核参数

操作如下:

cp /etc/sysctl.conf  /etc/sysctl.confbak
vi /etc/sysctl.conf    #在文件末尾添加以下内容

net.ipv4.ip_forward = 1 #修改为1

net.core.somaxconn = 262144

net.core.netdev_max_backlog = 262144

net.core.wmem_default = 8388608

net.core.rmem_default = 8388608

net.core.rmem_max = 16777216

net.core.wmem_max = 16777216

net.ipv4.netfilter.ip_conntrack_max = 131072

net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 180

net.ipv4.route.gc_timeout = 20

net.ipv4.ip_conntrack_max = 819200

net.ipv4.ip_local_port_range = 10024  65535

net.ipv4.tcp_retries2 = 5

net.ipv4.tcp_fin_timeout = 30

net.ipv4.tcp_syn_retries = 1

net.ipv4.tcp_synack_retries = 1

net.ipv4.tcp_timestamps = 0

net.ipv4.tcp_tw_recycle = 1

net.ipv4.tcp_tw_len = 1

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_keepalive_time = 120

net.ipv4.tcp_keepalive_probes = 3

net.ipv4.tcp_keepalive_intvl = 15

net.ipv4.tcp_max_tw_buckets = 36000

net.ipv4.tcp_max_orphans = 3276800

net.ipv4.tcp_max_syn_backlog = 262144

net.ipv4.tcp_wmem = 8192 131072 16777216

net.ipv4.tcp_rmem = 32768 131072 16777216

net.ipv4.tcp_mem = 94500000 915000000 927000000

/sbin/sysctl -p   #使配置立即生效

14.CentOS 系统优化

操作如下:

cp  /etc/profile  /etc/profilebak2
vi /etc/profile      #在文件末尾添加以下内容
ulimit -c unlimited
ulimit -s unlimited
ulimit -SHn 65535
ulimit -S -c 0
export LC_ALL=C
source  /etc/profile    #使配置立即生效
ulimit -a    #显示当前的各种用户进程限制

15.防止攻击

  • 禁用ping
cp  /etc/rc.d/rc.local  /etc/rc.d/rc.localbak
vi  /etc/rc.d/rc.local        #在文件末尾增加下面这一行
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all — 禁止ping
echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all — 解除禁止ping操作
参数0表示允许   1表示禁止
  • 防止DOS攻击,所有用户设置资源限制
vi /etc/security/limits.conf
#加入以下配置:
* hard core 0
* hard rss 10000
* hard nproc 20
  • 禁止IP伪装
vi /etc/host.conf  #在里面加上:
nospoof on
  • 垃圾IP封杀
more /var/log/secure
#首先通过以上命定观察多次扫描欲远程登入服务器的垃圾IP;
#然后在
vi /etc/hosts.deny
#增加:
sshd:61.131.47.157 —这以61.131.47.157这个垃圾IP为例!
  • 限制shell命令记录大小

每个用户的主目录下都存放着/home/axjsms/.bash_history文件,可存放多大500条命令,为了系统安全,需限制该文件大小,可修改为50,

vi /etc/profile 添加HISTSIZE=50;
  • ssh服务

修改ssh服务配置文件,使的ssh服务不允许直接使用root用户来登录,这样减少系统被恶意登录攻击的机会。

vi /etc/ssh/sshd_config
PermitRootLogin no

修改ssh默认的端口
ssh默认会监听22端口,可以修改至8822端口以避过常规的扫描

1、vi /etc/ssh/sshd_config#把port 22改为port 8822

2、 PermitEmptyPasswords no #注销掉禁止空密码帐户登入服务器!

3、MaxAuthTries 2 #两次不行就切断重新SSH启动登入

4、远程5分钟无操作自动注销:
vim /etc/profile
export TMOUT=300 #5分钟自动注销下来
#找到
HISTSIZE=1000 #修改为:
HISTSIZE=100  #减少日记字节为100KB,太大内容过多容易漏重要信息.

5、service sshd restart

6、查看端口是否正确,netstat -lnp|grep ssh

7、防火墙开放8822端口,
vi /etc/sysconfig/iptables,
#添加
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 8822 -j ACCEPT

5.重启iptables服务,service iptables restart

16.防火墙设置和端口设置

  • 防火墙设置
启动:        systemctl start firewalld  
关闭:        systemctl stop firewalld 
重启:        systemctl restart firewalld.service
查看状态:     systemctl status firewalld
开机禁用 :    systemctl disable firewalld
开机启用 :    systemctl enable firewalld
查看开机启动:  systemctl is-enabled firewalld.service
查看服务列表:  systemctl list-unit-files|grep enabled
  • 端口设置
1、开放端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent # 开放3306端口

firewall-cmd --zone=public --remove-port=9000/tcp --permanent  #关闭9000端口

firewall-cmd --reload   # 配置立即生效

2、查看防火墙所有开放的端口
firewall-cmd --zone=public --list-ports

3、查看防火墙状态
 firewall-cmd --state

如果要开放的端口太多,嫌麻烦,可以关闭防火墙,安全性自行评估
systemctl stop firewalld.service

重新载入
firewall-cmd --reload

4、查看监听的端口
netstat -lnpt

总结



  • CentOS 服务器安全设置基本完成。
  • 最小的权限+最少的服务=最大的安全