系统安全及应用

一、账号安全基本措施

1.1 系统账号清理

  • 将用户设置为无法登录、

  • 锁定账户

  • 删除账户

  • 锁定账户密码 本质锁定

shell——/sbin/nologin却比较特殊,所谓“无法登陆”指的仅是这个用户无法使用bash或其他shell来登陆系统而已,并不是说这个账号就无法使用系统资源。举例来说,各个系统账号中,打印作业有lp这个账号管理,www服务器有apache这个账号管理,他们都可以进行系统程序的工作,但就是无法登陆主机而已。

1.1.1 将用户设置为无法登录

[root@localhost ~]# tail /etc/passwd       
#查看lisi的属性

[root@localhost ~]# chsh -s /sbin/nologin lisi     
#修改lisi的shell属性
Changing shell for lisi.
Shell changed.
[root@localhost ~]# tail -1 /etc/passwd				
#查看lisi的属性
lisi:x:1001:1001::/home/lisi:/sbin/nologin



usermod -s /sbin/nologin lisi
1.1.2锁定用户:
[root@localhost ~]# passwd -l zhaosi
锁定用户 zhaosi 的密码 。
passwd: 操作成功
[root@localhost ~]# su zhangsan
[zhangsan@localhost root]$ su zhaosi
密码:
su: 鉴定故障
[root@localhost ~]# passwd -u zhaosi
解锁用户 zhaosi 的密码。
passwd: 操作成功
[root@localhost ~]# passwd -u zhaosi
解锁用户 zhaosi 的密码。
passwd: 操作成功
[root@localhost ~]# su zhangsan
[zhangsan@localhost root]$ su zhaosi
密码:
[zhaosi@localhost root]$ 
1.1.3删除账户
userdel -r  用户名

连带用户家目录一起删除

家目录   无主文件  前主人的uid
1.1.4锁定配置文件

chattr

-a   让文件或目录仅供附加用途。只能追加

-i    不得任意更动文件或目录

[root@localhost ~]# chattr +i /etc/passwd /etc/shadow
#加i
[root@localhost ~]# useradd liqi
useradd:无法打开 /etc/passwd
[root@localhost ~]# lsattr /etc/passwd /etc/shadow
----i----------- /etc/passwd
----i----------- /etc/shadow

chattr -i /etc/passwd /etc/shadow

去掉 i ,可以更动

中病毒怎么办?

使用  ps     top
查找到这个异常进程  ,通过进程pid  找到/proc/pid号/exe  找到文件的真实位置

1.把它删除

2.自己建立和病毒同名的文件  ,加上 chattr +i  锁定文件

1.2密码安全控制

1.2.1设置密码规则

对于新建用户

可以修改 /etc/login.defs 文件里的内容来设置密码规则

[root@localhost ~]# vim /etc/login.defs              
#适用于修改后生效后修改的用户
	 --------------------------------
	 25 PASS_MAX_DAYS   99999
     26 PASS_MIN_DAYS   0
     27 PASS_MIN_LEN    5
     28 PASS_WARN_AGE   7
[root@localhost ~]# tail -5 /etc/shadow            
#修改密码有效期限

表 1 /etc/login.defs文件内容

设置项 含义
MAIL_DIR /var/spool/mail  创建用户时,系统会在目录 /var/spool/mail 中创建一个用户邮箱,比如 lamp 用户的邮箱是 /var/spool/mail/lamp。
PASS_MAX_DAYS 99999 密码有效期,99999 是自 1970 年 1 月 1 日起密码有效的天数,相当于 273 年,可理解为密码始终有效。
PASS_MIN_DAYS 0 表示自上次修改密码以来,最少隔多少天后用户才能再次修改密码,默认值是 0。
PASS_MIN_LEN 5 指定密码的最小长度,默认不小于 5 位,但是现在用户登录时验证已经被 PAM 模块取代,所以这个选项并不生效。
PASS_WARN_AGE 7 指定在密码到期前多少天,系统就开始通过用户密码即将到期,默认为 7 天。
UID_MIN 500  指定最小 UID 为 500,也就是说,添加用户时,默认 UID 从 500 开始。注意,如果手工指定了一个用户的 UID 是 550,那么下一个创建的用户的 UID 就会从 551 开始,哪怕 500~549 之间的 UID 没有使用。
UID_MAX 60000 指定用户最大的 UID 为 60000。
GID_MIN 500 指定最小 GID 为 500,也就是在添加组时,组的 GID 从 500 开始。
GID_MAX 60000 用户 GID 最大为 60000。
CREATE_HOME yes 指定在创建用户时,是否同时创建用户主目录,yes 表示创建,no 则不创建,默认是 yes。
UMASK 077 用户主目录的权限默认设置为 077。
USERGROUPS_ENAB yes 指定删除用户的时候是否同时删除用户组,准备地说,这里指的是删除用户的初始组,此项的默认值为 yes。
ENCRYPT_METHOD SHA512 指定用户密码采用的加密规则,默认采用 SHA512,这是新的密码加密模式,原先的 Linux 只能用 DES 或 MD5 加密。

对于已有用户可以使用chage命令

chage

chage [选项] 用户名
-m:密码可更改的最小天数。为零时代表任何时候都可以更改密码。
-M:密码保持有效的最大天数。
-w:用户密码到期前,提前收到警告信息的天数。
-E:帐号到期的日期。过了这天,此帐号将不可用。
-d:更改用户最近一次修改密码的日期
-i:停滞时期。如果一个密码已过期这些天,那么此帐号将不可用。
-l:例出当前的设置。由非特权用户来确定他们的密码或帐号何时过期。

chage -d 2019-06-30 test             //设置test用户最后一次修改密码的日期为2019年6月30日

注:chage -d 0 test                           //则代表该test用户下一次登录一定修改密码


[root@localhost ~]#chage -M 30 lisi
#设置密码有效期为30天
[root@localhost ~]#cat /etc/shadow|tail -1
lisi:!!:19055:0:30:7:::
第5字段

使用 man 5 shadow  查看这9个字段的含义

1.3 命令历史

Shell 环境的命令历史机制为用户提供了极大的便利,但另一方面也给用户带来了潜在 的风险。只要获得用户的命令历史文件,该用户的命令操作过程将会一览无余,如果曾经在 命令行输入明文的密码,则无意之中服务器的安全壁垒又多了一个缺口。 Bash 终端环境中,历史命令的记录条数由变量 HISTSIZE 控制,默认为 1000 条。通 过修改  /etc/profile  文件中的 HISTSIZE 变量值,可以影响系统中的所有用户。例如,可以设 置最多只记录 200 条历史命令。

#可以使用以下命令临时清除历史命令
history  -c 

-c     clear

[root@localhost ~]#vim /etc/profile
.............................
export HISTSIZE=200

修改历史命令记录条数为 200 条。



[root@localhost ~]#source  /etc/profile

使用source /etc/profile保存配置后,新的环境变量只能在一个终端里面有效。
重新开启一个终端后,该环境变量失效。


解决方法:
重启系统:reboot,问题解决;

因为设置的环境变量,并没有真正生效,只是使用source 命令让临时运行而已。




#########退出清空密码#######
[root@localhost ~]#vim .bash_logout
#退出后清除   这个文件在 ~ 家目录里

# ~/.bash_logout
echo " " >~/.bash_history

#" "一定要加空格



[root@localhost ~]#vim .bashrc     自对自己生效
#开机后清除
echo " " >~/.bash_history

#设置超时时间
[root@localhost ~]# vi   /etc/profile   对所有用户生效
.................................
export  TMOUT=60

[root@localhost ~]# source  /etc/profile

1.4切换用户

su命令即 switch user,命令可以切换用户身份,并且以指定用户的身份执行命令

su [options...] [-] [user [args...]]

切换用户的方式:

su UserName:非登录式切换,即不会读取目标用户的配置文件,不改变当前工作目录,即不完全切换

su - UserName:登录式切换,会读取目标用户的配置文件,切换至自已的家目录,即完全切换

说明:root su 至其他用户无须密码;非root用户切换时需要密码

注意:su 切换新用户后,使用 exit 退回至旧的用户身份,而不要再用 su 切换至旧用户,否则会生成很多的bash子进程,环境可能会混乱

su 与 su -

即有 - 选项,切换用户身份更彻底;反之,只切换了一部分,这会导致某些命令运行出现问题或错误(例如无法使用 service 命令)。

[zhangsan@localhost ~]$ pwd
/home/zhangsan
[zhangsan@localhost ~]$ su 
密码:
[root@localhost zhangsan]# pwd
/home/zhangsan
[zhangsan@localhost ~]$ su -
密码:
上一次登录:二 7月 13 10:24:14 CST 2021pts/1 上
[root@localhost ~]# pwd
/root

限制使用 su 命令的用户

[root@localhost ~]# gpasswd -a lisi wheel
#将用户加入 wheel组 root

[root@localhost ~]#vim /etc/pam.d/su
#开启服务
#auth           required        pam_wheel.so use_uid

vim /etc/pam.d/su
2 # auth sufficient pam_ rootok.so
6 #auth required pam_ wheel.so use_ _uid

a)以上两行是默认状态(即开启第一行,注释第二行),这种状态下是允许所有用户间使用su命令进行切换的。
b)两行都注释也是允许所有用户都能使用su命令,但root'下使用su切换到其他普通用户需要输入密码;
如果第一行不注释,则root使用su切换普通用户就不需要输入密码
(pam rootok. so模块的主要作用是使uid为0的用户,即root用户能够直接通过认证而不用输入密码。)
c)如果开启第二行,表示只有root用户和wheel组内的用户才可以使用su命令
d)如果注释第一行,开启第二行,表示只有whee1组内的用户才能使用su命令,root用户也被禁用su命令。

1.5 PAM安全认证

PAM:Pluggable Authentication Modules,插件式的验证模块,Sun公司于1995 年开发的一种与认证相关的通用框架机制。PAM 只关注如何为服务验证用户的 API,通过提供一些动态链接库和一套统一的API 接口,将系统提供的服务和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序一种认证框架,自身不做认证。

http://www.linux-pam.org/
#官网手册

系统安全及应用_第1张图片

PAM提供了对所有服务进行认证的中央机制,适用于本地登录,远程登录,如:telnet,rlogin,fsh,ftp,点对点协议PPP,su等应用程序中,系统管理员通过PAM配置文件来制定不同应用程序的不同认证策略;应用程序开发者通过在服务程序中使用PAM API(pam_xxxx( ))来实现对认证方法的调用;而PAM服务模块的开发者则利用PAM SPI来编写模块(主要调用函数pam_sm_xxxx( )供PAM接口库调用,将不同的认证机制加入到系统中;PAM接口库(libpam)则读取配置文件,将应用程序和相应的PAM服务模块联系起来。重复利用别人的开发的功能,不必自己开发,会话,密码验证等功能,已经做好了调用下就可以了未来通用性,所以有了pam框架,类似淘宝 一边普通买家,一边卖家,淘宝上既是买家也是卖家

[root@localhost ~]#rpm -qi pam
#查看当前系统pam
[root@localhost ~]#rpm -ql pam
#查看模块

/usr/lib64/security    存放模块  .so

[root@localhost ~]#ls /usr/lib64/security/*.so|wc -l
#60个模块是二进制文件,不会直接修改
60

[root@localhost ~]#ls /etc/security/
#和上面的模块配合使用,有些比较简单的模块没有配置文件
access.conf       console.perms.d  namespace.d     sepermit.conf
chroot.conf       group.conf       namespace.init  time.conf
console.apps      limits.conf      opasswd
console.handlers  limits.d         pam_env.conf
console.perms     namespace.conf   pwquality.conf
我们会去修改配置文件
/etc/security
/etc/pam.d/*

 /etc/pam.d                  配置文件

系统安全及应用_第2张图片

系统安全及应用_第3张图片

type:指模块类型,即功能
control :    PAM库该如何处理与该服务相关的PAM模块的成功或失败情况,一个关健词实现
module-path: 用来指明本模块对应的程序文件的路径名
Arguments:   用来传递给该模块的参数

1.5.1PAM相关文件
  • 包名: pam

  • 模块文件目录:/lib64/security/*.so

  • 特定模块相关的设置文件:/etc/security/

  • man 8 加模块名 可以查看帮助

  • 应用程序调用PAM模块的配置文件

  1. 主配置文件:/etc/pam.conf,默认不存在,一般不使用主配置

  2. 为每种应用模块提供一个专用的配置文件:/etc/pam.d/APP_NAME

  3. 注意:如/etc/pam.d存在,/etc/pam.conf将失效

1.5.2PAM工作原理

PAM认证一般遵循这样的顺序:Service(服务)→PAM(配置文件)→pam_*.so

PAM认证首先要确定那一项服务,然后加载相应的PAM的配置文件(位于/etc/pam.d下),最后调用认证文件(位于/lib64/security下)进行安全认证

系统安全及应用_第4张图片

PAM认证过程示例:

1.使用者执行/usr/bin/passwd 程序,并输入密码
2.passwd开始调用PAM模块,PAM模块会搜寻passwd程序的PAM相关设置文件,这个设置文件一般是在/etc/pam.d/里边的与程序同名的文件,即PAM会搜寻/etc/pam.d/passwd此设置文件
3.经由/etc/pam.d/passwd设定文件的数据,取用PAM所提供的相关模块来进行验证
4.将验证结果回传给passwd这个程序,而passwd这个程序会根据PAM回传的结果决定下一个动作(重新输入密码或者通过验证)
1.5.3专用配置文件/etc/pam.d/ 格式

type     control     module-path     arguments

type:指模块类型,即功能

control :PAM库该如何处理与该服务相关的PAM模块的成功或失败情况,一个关健词实现

module-path: 用来指明本模块对应的程序文件的路径名

Arguments: 用来传递给该模块的参数

(application:指服务名,如:telnet、login、ftp等,服务名字“OTHER”代表所有没有在该文件中明确配置的其它服务)

模块类型(module-type)

  • Auth 账号的认证和授权

  • Account 帐户的有效性,与账号管理相关的非认证类的功能,如:用来限制/允许用户对某个服务的访问时间,限制用户的位置(例如:root用户只能从控制台登录)

  • Password 用户修改密码时密码复杂度检查机制等功能

  • Session 用户会话期间的控制,如:最多打开的文件数,最多的进程数等

  • -type 表示因为缺失而不能加载的模块将不记录到系统日志,对于那些不总是安装在系统上的模块有用

Control: ( 控制位)

  • required :一票否决,表示本模块必须返回成功才能通过认证,但是如果该模块返回失败,失败结果也不会立即通知用户,而是要等到同一type中的所有模块全部执行完毕,再将失败结果返回给应用程序,即为必要条件

  • requisite :一票否决,该模块必须返回成功才能通过认证,但是一旦该模块返回失败,将不再执行同一type内的任何模块,而是直接将控制权返回给应用程序。是一个必要条件

  • sufficient :验证成功立即返回,不再继续,否则忽略结果并继续

  • equired和requisiteoptional :表明本模块是可选的,它的成功与否不会对身份认证起关键作用,其返回值一般被忽略include: 调用其他的配置文件中定义的配置

  • optional 可选项

第三列代表PAM模块

默认是在/lib64/security/目录下,如果不在此默认路径下,要填写绝对路径。 同一个模块,可以出现在不同的模块类型中,它在不同的类型中所执行的操作都不相同,这是由于每个模块针对不同的模块类型编制了不同的执行函数。

每一行都是一个独立的认证过程; 每一行可以区分为三个字段: 认证类型 控制类型 PAM 模块及其参数 PAM 认证类型包括四种: 认证管理(authentication management):接受用户名和密码,进而对该用户的密码进行认证; 帐户管理(account management):检查帐户是否被允许登录系统,帐号是否已经过 期,帐号的登录是否有时间段的限制等; 密码管理(password management):主要是用来修改用户的密码; 会话管理(session management):主要是提供对会话的管理和记账。 控制类型也可以称做 Control Flags,用于 PAM 验证类型的返回结果。 1)required 验证失败时仍然继续,但返回 Fail 2)requisite 验证失败则立即结束整个验证过程,返回 Fail 3)sufficient 验证成功则立即返回,不再继续,否则忽略结果并继续 4)optional 不用于验证,只是显示信息(通常用于 session 类型)

例子:

系统安全及应用_第5张图片

1.5.4shell模块

功能:检查有效shell

帮助:man pam_shells

案例:不允许使用/bin/csh的用户本地登录

模块: pam_shells.so 只允许 规定的shell类型通过, 是在 /etc/shells 文件中存在的 类型通过

[root@localhost ~]#vim /etc/pam.d/su
auth required pam_shells.so
#第一行添加
配置项的含义为仅允许用户的shell为 /etc/shells
文件内的shell命令时,才能够成功


useradd -s /bin/csh lisi

新建一个shell类型为/bin/csh 的用户

使用  vim  /etc/shells

把 /bin/csh  去掉


这时 你su lisi 输入密码后也无法切换到其用户了。



[root@centos7 ~]#tail /var/log/secure

/var/log/secure 一般用来记录安全相关的信息,记录最多的是哪些用户登录服务器的相关日志,如果该文件很大,说明有人在破解你的 root 密码
1.5.5 securetty模块

功能:只允许root用户在/etc/securetty列出的安全终端上登陆

案例:CentOS 7 允许root在telnet登陆

vi /etc/pam.d/remote
#将下面一行加上注释
#auth required pam_securetty.so 
#或者/etc/securetty文件中加入
pts/0,pts/1…pts/n
#测试用root telnet登录

yum install telnet-server.x86_64 -y
systemctl start  telnet.socket
ss 


[root@node2 ~]#telnet 192.168.91.100


[root@localhost pam.d]#vim remote 
auth       required     pam_securetty.so
1.5.6 pam_nologin.so 模块

功能:如果/etc/nologin文件存在,将导致非root用户不能登陆,当该用户登陆时,会显示/etc/nologin文件内容,并拒绝登陆

范例: 默认此模块可以对ssh等登录有效,但不影响su登录

系统安全及应用_第6张图片

非 root 用户登录时 ,就会跳出 weihu 并无法登录。

1.5.7 limit

功能:在用户级别实现对其可使用的资源的限制,例如:可打开的文件数量,可运行的进程数量,可用内存空间

-H 设置硬资源限制,一旦设置不能增加。 ulimit - Hs 64; 限制硬资源,线程栈大小为 64K.
-S 设置软资源限制,设置后可以增加,但是不能超过硬资源设置 ulimit - Sn 32; 限制软资源,32 个文件描述符设置。
-a 显示当前所有的 limit 信息。 ulimit  -a  :显示当前所有的 limit 信息。
-c 最大的 core 文件的大小,以 blocks 为单位 ulimit  -c unlimited ; 对生成的 core 文件的大小不进行限制。
-d 进程最大的数据段的大小,以 Kbytes 为单位 ulimit -d unlimited;对进程的数据段大小不进行限制。
-f 进程可以创建文件的最大值,以 blocks 为单位。 ulimit -f 2048;限制进程可以创建的最大文件大小为 2048blocks.
-l 最大可加锁内存大小,以 Kbytes 为单位。 ulimit -l 32:限制最大可加锁内存大小为 32 Kbytes。
-m 最大内存大小,以 Kbytes 为单位。 ulimit  -m  unlimited ; 对最大内存不进行限制。
-n 可以打开最大文件描述符的数量。 ulimit  -n 128;限制最大可以使用 128 个文件描述符
-p 管道缓冲区的大小,以 Kbvtes 为单位 ulimit  -p 512; 限制管道缓冲区的大小为 512 Kbytes.
-s 线程栈大小,以 Kbytes 为单位 ulimit  -s 512; 限制线程栈的大小为 512 Kbytes.
-t 最大的 CPU 占用时间,以秒为单位 ulimit  -t unlimited;对最大的 CPU 占用时间不进行限制
-u 用户最大可用的进程数。进程最大可用的虚拟内存,以 Kbytes 为单位 ulimit  -u 64:限制用户最多可以使用 64 个进程
-v 进程最大可用的虚拟内存,以 Kbytes 为单位 ulimit -v 200000:限制最大可用的虚拟内存为 200000Kbvtes

修改限制的实现方式:

(1) ulimit命令

ulimit是linux shell的内置命令,它具有一套参数集,用于对shell进程及其子进程进行资源限制。

ulimit的设定值是 per-process 的,也就是说,每个进程有自己的limits值。使用ulimit进行修改,立即生效。

ulimit只影响shell进程及其子进程,用户登出后失效。

可以在 profile 中加入ulimit的设置,变相的做到永久生效

-H 设置硬件资源限制.
-S 设置软件资源限制.
-a 显示当前所有的资源限制.
-c size:设置core文件的最大值.单位:blocks
-d size:设置数据段的最大值.单位:kbytes
-f size:设置创建文件的最大值.单位:blocks
-l size:设置在内存中锁定进程的最大值.单位:kbytes
-m size:设置可以使用的常驻内存的最大值.单位:kbytes
-n size:设置内核可以同时打开的文件描述符的最大值.单位:n
-p size:设置管道缓冲区的最大值.单位:kbytes
-s size:设置堆栈的最大值.单位:kbytes
-t size:设置CPU使用时间的最大上限.单位:seconds
-u size:最大用户进程数
-v size:设置虚拟内存的最大值.单位:kbytes
unlimited 是一个特殊值,用于表示不限制

例子:

root@localhost pam.d]#ulimit -a
#可以看到系统的相关 资源限制 设置

#使用压力测试工具进行测试  打开的文件数
ab -c1025 -n 2000 http://192.168.91.100/
#必须这样写, 包括url 后面的 斜杠/


[root@localhost pam.d]#ulimit -n  10000
#修改最大值  临时修改

[root@localhost security]#vim /etc/security/limits.conf 
#永久修改不用重启   软硬一起设置可以直接使用 -


                   


zhangsan         -       nproc            5
#软硬限制 zhangsan 用户 可用进程最大数目为 5 


su  -   zhangsan
#切换时  注意要完全切换


pgrep -lu  zhangsan
列出zhangsan用户的 PID和进程名称

vim /etc/security/limits.conf  内的内容详情

# /etc/security/limits.conf
#
#This file sets the resource limits for the users logged in via PAM.
该文件为通过PAM登录的用户设置资源限制。
#It does not affect resource limits of the system services.
#它不影响系统服务的资源限制。
#Also note that configuration files in /etc/security/limits.d directory,
#which are read in alphabetical order, override the settings in this
#file in case the domain is the same or more specific.
请注意/etc/security/limits.d下按照字母顺序排列的配置文件会覆盖 /etc/security/limits.conf中的
domain相同的的配置
#That means for example that setting a limit for wildcard domain here
#can be overriden with a wildcard setting in a config file in the
#subdirectory, but a user specific setting here can be overriden only
#with a user specific setting in the subdirectory.
这意味着,例如使用通配符的domain会被子目录中相同的通配符配置所覆盖,但是某一用户的特定配置
只能被字母路中用户的配置所覆盖。其实就是某一用户A如果在/etc/security/limits.conf有配置,当
/etc/security/limits.d子目录下配置文件也有用户A的配置时,那么A中某些配置会被覆盖。
#
#Each line describes a limit for a user in the form:
#每一行描述一个用户配置
#   

#Where:
# can be:
# - a user name    一个用户名
# - a group name, with @group syntax    用户组格式为@GROUP_NAME
# - the wildcard *, for default entry    默认配置为*,代表所有用户
# - the wildcard %, can be also used with %group syntax,
# for maxlogin limit 
#
# can have the two values:
# - "soft" for enforcing the soft limits   “soft”表示执行软限制
# - "hard" for enforcing hard limits       “hard”表示强制执行硬性限制
有soft,hard和-,soft指的是当前系统生效的设置值,软限制也可以理解为警告值。
hard表名系统中所能设定的最大值。soft的限制不能比hard限制高,用-表名同时设置了soft和hard的值。
# can be one of the following:    可以使以下选项中的一个
# - core - limits the core file size (KB)    限制内核文件的大小。
# - data - max data size (KB)    最大数据大小
# - fsize - maximum filesize (KB)    最大文件大小
# - memlock - max locked-in-memory address space (KB)    最大锁定内存地址空间
# - nofile - max number of open file descriptors 最大打开的文件数(以文件描叙符,file descripter计数) 
# - rss - max resident set size (KB) 最大持久设置大小
# - stack - max stack size (KB) 最大栈大小
# - cpu - max CPU time (MIN)    最多CPU占用时间,单位为MIN分钟
# - nproc - max number of processes 进程的最大数目
# - as - address space limit (KB) 地址空间限制 
# - maxlogins - max number of logins for this user    此用户允许登录的最大数目
# - maxsyslogins - max number of logins on the system    系统最大同时在线用户数
# - priority - the priority to run user process with    运行用户进程的优先级
# - locks - max number of file locks the user can hold    用户可以持有的文件锁的最大数量
# - sigpending - max number of pending signals
# - msgqueue - max memory used by POSIX message queues (bytes)
# - nice - max nice priority allowed to raise to values: [-20, 19] max nice优先级允许提升到值
# - rtprio - max realtime pr iority
#
#                  
#

#*               soft    core            0
#*               hard    rss             10000
#@student        hard    nproc           20
#@faculty        soft    nproc           20
#@faculty        hard    nproc           50
#ftp             hard    nproc           0
#@student        -       maxlogins       4

# End of file
*                soft    core            unlimited
*                hard    core            unlimited
*                soft    nproc           1000000
*                hard    nproc           1000000
*                soft    nofile          1000000
*                hard    nofile          1000000
*                soft    memlock         32000
*                hard    memlock         32000
*                soft    msgqueue        8192000
*                hard    msgqueue        8192000

#limits  生产中的  建议设置

1.6 sudo

superuser do

sudo 即superuser do,允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等。这样不仅减少了root用户的登录 和管理时间,同样也提高了安全性在最早之前,一般用户管理系统的方式是利用su切换为超级用户。但是使用su的缺点之一在于必须要先告知超级用户的密码。sudo于1980年前后推出,sudo使一般用户不需要知道超级用户的密码即可获得权限。首先超级用户将普通用户的名字、可以执行的特定命令、按照哪种用户用户组的身份执行等信息,登记在特殊的文件中(通常是/etc/sudoers),即完成对该用户的授权(此时该用户称为“sudoer”);在一般用户需要取得特殊权限时,其可在命令前加上“sudo”,此时sudo将会询问该用户自己的密码(以确认终端机前的是该用户本人),回答后系统即会将该命令的进程以超级用户的权限运行。之后的一段时间内(默认为5分钟,可在/etc/sudoers自定义),使用sudo不需要再次输入密码。由于不需要超级用户的密码,部分Unix系统甚至利用sudo使一般用户取代超级用户作为管理帐号,例如Ubuntu、Mac OS X等

sudo特性:

  • sudo能够授权指定用户在指定主机上运行某些命令。如果未授权用户尝试使用 sudo会提示联系管理员

  • sudo提供了丰富的日志,详细地记录了每个用户干了什么。它能够将日志传到中心主机或者日志服务器

  • sudo使用时间戳文件来执行类似的“检票”系统。当用户调用sudo并且输入它的密码时,用户获得了一张存活期为5分钟的票

  • sudo的配置文件是sudoers文件,它允许系统管理员集中的管理用户的使用权限和使用的主机。它所存放的位置默认是在/etc/sudoers,属性必须为0440

su root

vim /etc/sudoers
visudo
#两种方法,推荐第二种

root    ALL=(ALL)  ALL                 # 系统默认
user1   ALL=(ALL)  ALL                 # user1 可以使用最高权限 需要输入用户密码
user2   ALL=(ALL)  NOPASSWD : ALL      # user2 可以使用最高权限 不需要输入用户密码

# 如果设置用户组前面加 %

%group1  ALL=(ALL)  ALL                # 用户组group1下所有用户可以使用最高权限


visudo -c
#检查语法

第一个ALL是指网络中的主机,我们可以指定主机名,这样user-1用户只可以在此主机上执行后面的命令。第二个括号里的ALL是指目标用户,也就是以谁的身份去执行命令,最后一个命令指命令名称。

#用户    登入主机    =    (代表用户)     命令
#user  	host       =    (runas)       command
root     ALL=(root)                   A

user: 运行命令者的身份
host: 通过哪些主机 多个 192.168.91.100 - 110  localhost
(runas):以哪个用户的身份
command: 运行哪些命令

例如,我们想让 lisi 用户在zhangsan主机上以 laow 的身份执行 mount /dev/sr0 /mnt 命令,就可以这样编写配置文件:

lisi zhangsan=(laow)    /usr/bin/mount /dev/sr0 /mnt

但是 lisi 用户输入 sudo mount /dev/sr0 /mnt/   可以吗?
不可以,想要执行必须要使用指定给你执行的命令。

那么我们该如何做既可用加 /mnt/ 执行 ,也可用 /mnt 执行。

lisi zhangsan=(laow)    /usr/bin/mount /dev/sr0 /mnt*,!/usr/bin/mount /dev/sr0 /mnt* *

这段的意思是mnt 后面可跟任意字符 ,但不允许出现空格,不然失效。

例2:只允许user-1用户以root身份在node-1主机上执行ls、cat命令,并且执行的时候免输入密码。

lisi  zhangsan=(root)  NOPASSWD:/usr/bin/cat,/usr/bin/ls

#可以跟多个命令
lisi     ALL=(root)     /usr/bin/mount /dev/cdrom /mnt/,/usr/bin/umount  /mnt/

#也可以对组进行操作
%在前表示组
## Allows people in group wheel to run all commands
%wheel  ALL=(ALL)       ALL 

[root@localhost ~]#gpasswd -a liwu wheel
正在将用户“liwu”加入到“wheel”组中
wheel组表示管理员组是比较特殊的一个组,在wheel组中的成员可以使用任何命令

#思考这个设置有意义么?

root    ALL=(ALL)       ALL

这段的意思是 任意机器上的root用户都可以在本机上执行任何命令。

我们都知道 不是你叫 root 就一定是超级管理员,而是根据用户 uid 0 决定的。如果这台主机 超级管理员 名称不是 root ,其他远程登录到这台主机的人是一个名称为 root 的用户 ,我们就可以在这台主机上想做什么就做什么。 

[root@localhost ~]#sudo -V
#可以查看相关配置信息

#67  Defaults   env_reset,timestamp_timeout=2

#启用sudo操作日志   可以增加一个日志
visudo
Defaults logfile = "/var/log/sudo"
1.6.1 别名

sudo别名有四种类型:

  • User_Alias(用户)

  • Runas_Alias(代表用户)

  • Host_Alias(登录主机)

  • Cmnd_Alias(命令)

别名格式:开头必须大写字母,数字可以使用但是不能放在开头

visudo

###别名
Host_Alias MYHOSTS = kgc,localhost          机器
User_Alias MYUSERS = zhangsan,wangwu,lisi    用户
Cmnd_Alias MYCMNDS = /sbin/*,!/sbin/reboot,!/sbin/poweroff,!/sbin/init,!/usr/bin/rm   命令
MYUSERS MYHOSTS=NOPASSWD:MYCMNDS   加上这个生效


Host_Alias MYHOSTS = 
定义了主机别名,相当于一个组,组里有kgc  localhost 主机名。主机名相当于域名 这里也可以填写对应主机名的 IP 地址。


User_Alias MYUSERS = 
定义了用户别名


Cmnd_Alias MYCMNDS =
表示可以使用哪些命令



MYHOSTS , MYUSERS , MYCMNDS  这三个可以自己定义。
MYHOST     USERS      MYCMD
当然最后的那一段也要更改
USERS MYHOST=NOPASSWD:MYCMD


其他一些内容:
vim /etc/hosts
192.168.80.16 none1
ping none1 相当于 ping 192.168.80.16

1.6.2 子目录
[root@localhost sudoers.d]#vim /etc/sudoers.d/lisi

lisi ALL=        NOPASSWD:ALL
#lisi可以不使用密码输入任何命令



lisi ALL= sudoedit
#lisi 变相管理员 ,可以使用 sudoedit 命令  可以编辑visudo     不建议加上这个。


[root@localhost sudoers.d]#chmod 400 test 
#设置权限,加固安全


[root@localhost ~]#su lisi
[lisi@localhost root]$ sudoedit /etc/sudoers
#李四使用sudoedit  可以修改sudo配置文件

权限先听子目录的再听主目录的。

1.7 grub 加密

/etc/grub.d目录

定义每个菜单项的所有脚本都存放在/etc/grub.d目录中,这些脚本的名称必须有两位的数字前缀,其目的是构建GRUB 2菜单时定义脚本的执行顺序以及相应菜单项的顺序,比如00_header文件首先被读取。

文件 描述
00_header 设置grub默认参数
10_linux 系统中存在多个linux版本
20_ppc_terminfo 设置tty控制台
30_os_prober 设置其他分区中的系统(硬盘中有多个操作系统时设置)
40_custom和41_custom 用户自定义的配置
设置GRUB 2加密

由于GRUB 2负责引导linux系统,其作为系统中的第一道屏障的安全性非常重要,对GRUB 2进行加密可以实现安全性。

在默认情况下,GRUB 2对所有可以在物理上进入控制台的人都是可访问的。任何人都可以选择并编辑任意菜单项,并且可以直接访问GRUB命令行。要启用认真支持,必须将环境变量超级用户设置为一组用户名(可以使用空格、逗号、分号作为分隔符)这样就只允许超级用户使用GRUB命令行、编辑菜单项以及执行任意菜单项。

GRUB 2密码支持以下两种格式

  • 明文密码:密码数据没有经过加密,安全性差

  • PBKDF2加密密码:密码经过PBKDF2哈希算法进行加密,在文件中存储的是加密后的密码数据,安全性较高。

先要使用grub2-mkpasswd-pbkdf2命令生成PBKDF2加密口令,然后在/etc/grub.d/00_header文件中添加超级用户和PBKDF2加密口令,最后使用grub2-mkconfig命令生成grub配置文件。

在/etc/grub.d/00_header文件中添加用户和PBKDF2加密口令的格式如下。centos 6 必须这样设置

[root@kgc ~]# grub2-mkpasswd-pbkdf2      #根据提示设置GRUB菜单的密码
输入口令:
Reenter password:  123456
PBKDF2 hash of your password is grub.pbkdf2.sha512.10000.E96097D1B1E470345D9FB62759335832B4A0F39CD4C9A57B502BD59CF1B8C393EEA37847984E242AAD4BFBB72E4BDC2196E6A7495CE7C86BF3D2498A34CAC2B7.B2EB99ED40267AE9496357B78C0DC04CE79957980A4A3FFA577B7502D70A5412D2EAD5CE4DAAC0FE068621CB29B76E44A7645EDCC7784FF20E113AF0B95E3467i

[root@kgc ~]# cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg.bak
[root@kgc ~]# cp /etc/grub.d/00_header /etc/grub.d/00_header.bak
#备份文件  
[root@kgc ~]# vim /etc/grub.d/00_header
#最后
cat << EOF 
set superusers="root"  
#设置登录用户

password_pbkdf2 root 
#设置密码
grub.pbkdf2.sha512.10000.E96097D1B1E470345D9FB62759335832B4A0F39CD4C9A57B502BD59CF1B8C393EEA37847984E242AAD4BFBB72E4BDC2196E6A7495CE7C86BF3D2498A34CAC2B7.B2EB99ED40267AE9496357B78C0DC04CE79957980A4A3FFA577B7502D70A5412D2EAD5CE4DAAC0FE068621CB29B76E44A7645EDCC7784FF20E113AF0B95E3467i
EOF
使用 grub2-mkconfig 命令生成新的 grub.cfg 配置文件。
[root@kgc ~]# grub2-mkconfig -o /boot/grub2/grub.cfg //生成新的 grub.cfg 文件

重启系统进入GRUB菜单时,按e键将需要输入账号密码才能修改引导参数。

cat << EOF
set superusers="root"
password_pbkdf2 root  grub.pbkdf2.sha512.10000.4F3CD9383616C3AAFB1E98A289CB707A6FEEDAE7BEFB10A59642FE641C8F13AD9A27EAD43DEB07D9F4228149C716FA40C8C04E13E98FFAC45EF7AA2AD76C96B9.49CEC46B324DC9A94D0B461C711569ADB79213708929B1891232DB5FE31EC6F5A0A4E4D0A4AA0EAA64E38A6876EEB3B5EBF8991D0FB04537E1F39D1AA40D1AD5
EOF


cat << EOF
set superusers="用户" 
password_pbkdf2 用户  加密密码
EOF

[root@localhost ~]#grub2-setpassword
#直接设置密码

1.8 暴力破解密码

弱口令检测一 -John the Ripper.
John the Ripper是一-款开源的密码破解工具,可使用密码字典(包含各种密码组合的列表文件)来进行暴力破解。

./configre  安装路径和选择功能
make        .c .py 高级语言 机器   make(编译) 高级编译二进制  0 1 让机器课读懂
make install 将程序 存起来


cd /opt
tar. zxf john-1.8.0.tar.gz
#解压工具包

yum install -y gcc gcc-c++ make
#安装软件编译工具

cd /opt/john-1.8.0/src
#切换到src子目录

make clean linux-x86-64
#进行编译安装

cp /etc/shadow /opt/shadow.txt
#准备待破解的密码文件

cd /opt/john-1.8.0/run
./john /opt/shadow.txt
#执行暴力破解

./john --show /opt/shadow.txt
#查看已破解出的账户列表

> john. pot
#使用密码字典文件
#清空已破解出的账户列表,以便重新分析
./john --wordlist=./password.1st /opt/shadow.txt
#使用指定的字典文件进行破解

1.9 nmap 扫描

系统安全及应用_第7张图片

===============网络端口扫描============
控制位
SYN  建立链接
ACK  确认
FIN  结束断开
PSH  传送 0 数据缓存   上层应用协议
RST  重置
URG  紧急

紧急URG(URGent) 当URG等于1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据),而不要按照原来的排队顺序来传送。
当URG置为1的时,发松应用进程就告诉发送方的TCP的有紧急数据要传传送,于是发送方TCP就把紧急数据插入到本报文段数据的最前面,而在紧急数据后面的数据仍是普通数据,这时要与首部的紧急指针配合来使用。
确认ACK(ACKnowledgment) 仅当ACK = 1 时确认号字段才有效,当ACK = 0时,确认号无效。TCP规定,在连接建立之后所有的传送的报文段都必须把ACK置为1;

推送PSH(PuSH) 当两个应用进程进行交互式的通信时,有时在一端的应用进程希望键入一个命令后立即就能够收到对方的响应,在这种情况下,TCP就可以使用推送PSH操作,发送方的TCP把PSH置为1,并立即创建一个报文段发送出去。接收方收到PSH = 1的报文段,就尽快地(即“推送”向前)交付接受应用进程,而不再等到整个缓存都填满了再向上交付;

复位RST(ReSeT)当RST = 1时,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立运输连接。RST置1还用来拒绝一个非法的报文段或拒绝一个打开一个连接。RST也称为重建位或重置位;

同步SYN(SYNchronization) 在连接建立时用来同步序号。当SYN = 1时而ACK = 1时表示这是一个连接请求报文段。对方若同意连接,则应在响应的报文段中是SYN = 1 和ACK = 1,因此SYN = 1就表示这是以恶搞连接请求或连接接受报文;
终止FIN(FINis) 用来释放一个连接,当FIN = 1时,表示次报文段的发送方的数据已经发送完毕,并要求释放运输连接







#安装
rpm -qa|grep nmap  查看nmap
yum install -y nmap




nmap命令常用的选项和描类型
-p:指定扫描的端口。
-n:禁用反向DNS解析(以加快扫描速度) ip转换成 域名  12222 2www.baidu.com       
-sS: TCP的SYN扫描 (半开扫描),只向目标发出SYN数据包,如果收到SYN/ACK响应包就认为目标端口正在监听,并立即
断开连接;否则认为目标端口并未开放。
-sT: TCP连接扫描,这是完整的TCP扫描方式(默认扫描类型),用来建立一个TCP连接,如果成功则认为目标端口正在监
听服务,否则认为目标端口并未开放。
-sF:TCP的FIN扫描,开放的端口会忽略这种数据包,关闭的端口会回应RST数据包。许多防火墙只对sYN数据包进行简单
过滤,而忽略了其他形式的TCP攻击包。这种类型的扫描可间接检测防火墙的健壮性。
-sU: UDP扫描,探测目标主机提供哪些UDP服务,UDP扫描的速度会比较慢。
-sP: ICMP 扫描,类似于ping检测,快速判断目标主机是否存活,不做其他扫描。
-P0:跳过ping检测, 这种方式认为所有的目标主机是存活的,当对方不响应ICMP请求时,使用这种方式可以避免因无法
ping通而放弃扫描。


用于主机发现的一些用法
-sL: List Scan 列表扫描,仅将指定的目标的IP列举出来,不进行主机发现。  
  
-sn: Ping Scan 只进行主机发现,不进行端口扫描。  
  
-Pn: 将所有指定的主机视作开启的,跳过主机发现的过程。  
  
-PS/PA/PU/PY[portlist]: 使用TCPSYN/ACK或SCTP INIT/ECHO方式进行发现。  
  
-PE/PP/PM: 使用ICMP echo, timestamp, and netmask 请求包发现主机。-PO[protocollist]: 使用IP协议包探测对方主机是否开启。  
  
-n/-R: -n表示不进行DNS解析;-R表示总是进行DNS解析。  
  
--dns-servers : 指定DNS服务器。  
  
--system-dns: 指定使用系统的DNS服务器  
  
--traceroute: 追踪每个路由节点 


Nmap用于端口扫描的一些用法
-sS/sT/sA/sW/sM:指定使用 TCP SYN/Connect()/ACK/Window/Maimon scans的方式来对目标主机进行扫描。  
  
  -sU: 指定使用UDP扫描方式确定目标主机的UDP端口状况。  
  
  -sN/sF/sX: 指定使用TCP Null, FIN, and Xmas scans秘密扫描方式来协助探测对方的TCP端口状态。  
  
  --scanflags : 定制TCP包的flags。  
  
  -sI : 指定使用idle scan方式来扫描目标主机(前提需要找到合适的zombie host)  
  
  -sY/sZ: 使用SCTP INIT/COOKIE-ECHO来扫描SCTP协议端口的开放的情况。  
  
  -sO: 使用IP protocol 扫描确定目标机支持的协议类型。  
  
  -b : 使用FTP bounce scan扫描方式  

nmap命令常用的选项和描类型
-p:指定扫描的端口。
-n:禁用反向DNS解析(以加快扫描速度) ip转换成 域名  12222 2www.baidu.com       
-sS: TCP的SYN扫描 (半开扫描),只向目标发出SYN数据包,如果收到SYN/ACK响应包就认为目标端口正在监听,并立即
断开连接;否则认为目标端口并未开放。
-sT: TCP连接扫描,这是完整的TCP扫描方式(默认扫描类型),用来建立一个TCP连接,如果成功则认为目标端口正在监
听服务,否则认为目标端口并未开放。
-sF:TCP的FIN扫描,开放的端口会忽略这种数据包,关闭的端口会回应RST数据包。许多防火墙只对sYN数据包进行简单
过滤,而忽略了其他形式的TCP攻击包。这种类型的扫描可间接检测防火墙的健壮性。
-sU: UDP扫描,探测目标主机提供哪些UDP服务,UDP扫描的速度会比较慢。
-sP: ICMP 扫描,类似于ping检测,快速判断目标主机是否存活,不做其他扫描。
-P0:跳过ping检测, 这种方式认为所有的目标主机是存活的,当对方不响应ICMP请求时,使用这种方式可以避免因无法
ping通而放弃扫描。

示例:
#分别查看本机开放的TCP端口、UDP端口
nmap -sT 127.0.0.1
nmap -sU 127.0.0.1
#检测192.168.80.0/24网段有哪些主机提供HTTP服务
nmap -p 80 192.168.80.0/24
nmap -p 80 192.168.91.100/24
#检测192.168.80.0/24网段有哪些存活主机
nmap -n -sP 192.168.80.0/24 


80 http
443 https 加密与否
ssh 22

httpd  服务名程序  

apache   nginx   tomcat 软件名
服务 端口号
HTTP 80
HTTPS 443
Telnet 23
FTP 21
SSH(安全登录)、SCP(文件传输)、端口重定向 22
SMTP 25
POP3 110
WebLogic 7001
TOMCAT 8080
WIN2003远程登录 3389
Oracle数据库 1521
MS SQL* SEVER数据库sever 1433
MySQL 数据库sever 3306

你可能感兴趣的:(系统安全,安全)