第四章 CentOS安全了解... 66
第一节 user、group、chmod. 66
I 10位文件属性... 66
II user/group增删改... 67
III user/group配置文件... 68
IV 进程权限... 70
第二节 visudo. 71
I 文件自带的示例... 71
II /etc/sudoers无法保护root密码... 71
III 示例... 71
IV Sudo -l #查看可用命令列表... 72
V root用户和sudo使用root权限的区别... 72
第三节 PAM嵌入式认证模块... 73
I /etc/pam.conf文件... 74
II /etc/pam.d/目录... 74
III pam_tally2.so多次登陆失败后锁定帐号... 77
IV 温馨提示... 79
第四节 SSH Key登录... 79
I 1、制作用户的rsa密钥... 79
II 2、下载密钥文件scp、pscp. 80
III 3、配置SSHd. 81
IV 4、配置SSH Client 83
第五节 PuTTY+Xming. 84
第六节 systemctl 84
I systemd服务以root身份运行... 85
第七节 firewall-cmd. 85
I 示例... 86
II 区域... 87
III Help. 87
第八节 crond定时任务... 87
I /etc/crontab. 87
II /etc/cron.d/ 88
III crontab用户级... 89
第九节 系统日志/var/log. 89
第十节 uptime理解系统负荷... 90
I 一个类比... 90
II 经验法则... 91
III 多路多核CPU.. 91
IV 最佳观察时长... 91
第四章 CentOS安全了解
第一节 user、group、chmod
I 10位文件属性
Ls -lh <.|/etc/m|m> <默认>按字母顺序列出指定文件或指定文件夹的文件和文件夹
Ls -lh </etc/m*|m*> 按字母顺序列出符合过滤器的文件及子文件夹下的所有文件与目录
Ls -lhd </etc/m*|m*> 按字母顺序列出符合过滤器的文件及子文件夹的所有文件与目录
文件属性 |
文件数 |
所有者 |
所属组 |
文件大小 |
修改时间(月/日/年或时) |
文件名 |
0-123-456-789 |
第0位表示文件类型 s p表示命名管道文件 s d表示目录文件 s l表示符号连接文件 s -表示普通文件 s s表示socket文件 s c表示字符设备文件 s b表示块设备文件 |
s 第123-456-789位分别表<所有者u-user、同组用户g-group、其他用户o-other>的权限。 s r只读、w可写、x执行,x在目录时与『能否进入该目录』有关。 s 因rwx位置固定,二进制转换十进制后为421,再相加得到7或6或5或4;所以也有777、755、754、750、600说法。 |
改所有者/所属组
只有文件主或超级用户可修改,R为子目录,h为仅符号链接文件。
change group改所属组:chgrp [-R] <组名> <文件或目录>
change owner改所有者:chown [-hR] <用户名[:组名]> <文件或目录>
chmod:改权限及SUID/SGID/SBIT等特性
chmod [-R] 777 filename
s 777:所有人可做所有操作
s 755:所有者可读写执行,同组用户可读可执行,其他用户可读可执行(755为最常见)
s 754:所有者可读写执行,同组用户可读可执行,其他用户可读
chmod [-R] +rx filename 或 chmod [-R] o=rx,go=rx filenme
s ugoa:所有者u-user、同组用户g-group、其他用户o-other、所有用户a-all<默认>
s +-=:增加权限+、删除权限-、重新设置权限=
s rwx:读r、写w、执行x
umask:新建文件的缺省权限
umask设置了用户创建文件默认没有的权限,它与chmod的效果刚好相反。umask命令只能临时修改umask值,系统重启之后umask将还原成默认值。如果要永久修改umask值,需要修改/etc/profile、/etc/bashrc、$ [HOME]/.bash_profile、$[HOME]/.profile或$[HOME]/.bashrc中设置umask值。
touch ~/file;mkdir ~/filedir;ls -ld ~/file ~/filedir/;rm -rf ~/file ~/filedir/
在使用umask命令之前一定要弄清楚到底希望具有什么样的文件/目录创建缺省权限。否则可能会得到一些非常奇怪的结果;例:umask 600,那么所创建的文件/目录的缺省权限就是066!
nnnn
umask是从权限中“拿走”相应的,且文件创建时不能赋予执行权限。nnnn的第一个n是定义特殊的权限,chmod也有4,但一般也是省略。
权限是000~777,而umask nnn是通过777-nnn(文件夹)或666-nnn(文件)得到是最终的权限,因为nnn是定义没有的权限。
umask |
文件 |
目录 |
002 |
664 |
775 |
007 |
660 |
770 |
022 |
644 |
755 |
027 |
640 |
750 |
链接文件
链接文件自身默认是777的权限,且无法修改。但对链接文件使用chmod命令,生效的是实际源文件。
II user/group增删改
user |
group | ||
useradd [-g|G 组名] name |
新增用户并加g私有组G附加组 -s:默认为/bin/bash,非登录用户指定为/sbin/nologin |
groupadd name |
添加 |
userdel name |
删除 |
groupdel name |
删除 |
usermod [选项] name |
--login 改登录名 -s -L 锁定 -U 解锁 -g 主组 / -G 附加组 -a |
groupmod -n newname name |
改名 |
gpasswd -d user gname |
组中删除用户 |
|
|
passwd [选项] name chage [选项] name |
改密码 (密码效期)
|
gpasswd -r groupmod -p newpwd name |
清空密码 改密码 |
id [name] |
查看name信息 |
id -G name groups user1 |
查看组id 看用户所在组 |
useradd - |
查看useradd默认配置 |
|
|
[root@cos7 ~]# id oracle
uid=1002(oracle) gid=1002(oinstall) 组=1002(oinstall),1003(dba)
[root@cos7 ~]# usermod -G oper -a oracle
[root@cos7 ~]# id oracle
uid=1002(oracle) gid=1002(oinstall) 组=1002(oinstall),1003(dba),1004(oper)
查看所有用户与ID:cat /etc/passwd |cut -f 1,3 -d : |less
查看所有用户组与GID:cat /etc/group|less
组的类型
私有组/基本组:同用户名,且仅它自己一个用户,使用useradd -g groupname username除外。
公共组/附加组:CentOS 使用私有群组机制,因此这个设定项目是不会生效的!
初始组(initial group):/etc/passwd中的GID,所以登录后就是。
有效组(effective group):dmtsai 账号同时支持 dmtsai 与 users 这两个群组,在创建新的文件时,新文件的群组是 dmtsai 还是 users ?这时就看当时的有效群组了 (effective group)。
有效群组的切换:newgrp 组名
III user/group配置文件
grep sauser /etc/passwd /etc/shadow /etc/group
getent passwd|shadow|group|gshadow sauser
用户信息/etc/passwd
保存了用户账号的基本信息,每一行使用『:』分隔开,共有七个。
帐号名称 |
密码 |
UID |
GID |
帐号说明 |
Home目录 |
Shell目录 |
密码:以X代替,实际存放/etc/shadow里
UID:0为root,1~999为系统预留,所以1000为第一个用户
GID:用户组的ID,与UID一样,0为root,1~999为系统预留,所以1000为第一个用户组。
Shell目录:一般是/bin/bash,若是/sbin/nologin则不能登录系统。
用户密码/etc/shadow
保存了密码字串,有效期等信息,每一行使用『:』分隔开,共有九个。
用户名 |
密码 |
上次修改日期 |
最短有效天数 |
最长有效天数 |
失效警告天数 |
有效宽限天数 |
失效日期 |
保留 |
日期看不懂?没事,使用passwd -S username 查看。
用户组信息/etc/group
组名:密码:GID:组成员(空则为GID的用户)
用户组密码/etc/gshadow
组名:密码(空或!表示没有):组管理者:组内用户列表
useradd模板文件
/etc/login.defs:限制与规划文件,如密码/UID/GID、==
/etc/default/useradd:可用useradd -D来查看修改,或者直接修改此文件
/etc/skel/*:新建用户时,将此目录里面的内容就拷贝此用户的~目录下
IV 进程权限
linux系统中每个进程都有2个ID,分别为用户ID和有效用户ID,UID一般表示进程的创建者(属于哪个用户创建),而EUID表示进程对于文件和资源的访问权限(具备等同于哪个用户的权限)。可以通过函数getuid()和geteuid()或者进程的两个ID值。
当一个用户登陆系统时,系统会将UID和EUID都赋值为/etc/passwd文件中的UID,一般情况下2个ID是相同的,但是某些情况下会出现2个ID不同的情况。
进程三个ID
real user ID (uid): 实际用户ID,指的是进程执行者是谁
effective user ID (euid): 有效用户ID,指进程执行时对文件的访问权限
saved set-user-ID (saved uid): 保存设置用户ID。是进程刚开始执行时,euid的副本。在执行exec调用之后能重新恢复原来的effectiv user ID.
文件二个
set-user-ID (suid)/set-group-ID(sgid):设置用户/用户组ID,这是相对于文件来说的。
设置了set-user-ID位的可执行程序执行时,进程的effective user ID与saved set-uesr-ID都为程序文件所属用户的ID,
real user ID与effective user ID就不一定相等了,这类程序称之为SUID程序,这类程序有特殊的用途(典型的例子:passwd程序,ping程序等)。
第二节 visudo
虽然 vim /etc/sudoers也可修改,但还是强烈推荐使visudo命令去修改此文件,因为它会帮你校验文件配置是否正确,如果不正确,在保存退出时就会提示你哪段配置出错的。
整个文件分三部:
1、别名(Alias)定义:《名称必须是大写》Host_Alias、Cmnd_Alias、User_Alias、Runas_Alias,可以在规则配置时引用,但默认全注释了。
2、环境变量定义:以Defaults开头的行。
3、规则配置:重点
I 文件自带的示例
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
#被授权用户名 登录主机=[(可用帐号)] [NOPASSWD: ]可执行命令
登录主机:执行命令的主机,小写为单台主机,大写为主机组别名
Runas_Alias/可用帐号:sudo -u username,无则为root
NOPASSWD:执行命令前不验证用户密码
## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL,!/usr/bin/passwd,!/usr/sbin/visudo
#允许wheel组中用户执行所有命令,但禁止passwd/visudo命令,即不能改其他用户的密码。
## 允许users用户组中的用户像root用户一样使用mount、unmount、cdrom命令
# %users ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom
## 允许users用户组中的用户像root用户一样使用shutdown命令
# %users localhost=/sbin/shutdown -h now
II /etc/sudoers无法保护root密码
sudo后,就是root的权限,可以修改此文件,删除,!/usr/bin/passwd,!/usr/sbin/visudo语句,再通过sudo passwd root来修改root密码。
III 示例
test centos=ALL,!/usr/bin/passwd,!/usr/bin/passwd root
IV Sudo -l #查看可用命令列表
V root用户和sudo使用root权限的区别
sudo(switch user do)与su(switch user)是不一样的,sudo是以root的身份执行一条命令,语法为 sudo <指令>;可以使用sudo的用户为被root加入『/etc/sudoers』文件中的用户,使用sudo时,要求输入的密码是『该位用户自己的密码』不需要知道root的密码。使用的环境变量为用户本身的,而不是root的环境变量;命令执行时,uid是不一样,但euid是相同的,为root的euid。
由root用户切换到FSP(普通用户),不需要密码;由FSP(普通用户)切换到root,需要密码。
注意命令与前缀的变化(#是root特有标志):
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
Last login: Sun Jan 21 10:08:10 2018
[sauser@centos ~]$ id
uid=1000(sauser) gid=1000(sauser) 组=1000(sauser) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[sauser@centos ~]$ sudo sh
[sudo] sauser 的密码:
sh-4.2# id
uid=0(root) gid=0(root) 组=0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
sh-4.2# exit
exit
[sauser@centos ~]$ sudo su
[root@centos sauser]# id
uid=0(root) gid=0(root) 组=0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[root@centos sauser]# exit
exit
[sauser@centos ~]$ su root
密码:
[root@centos sauser]# id
uid=0(root) gid=0(root) 组=0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[root@centos sauser]# exit
exit
[sauser@centos ~]$ exit
登出
Connection closing...Socket close.
Connection closed by foreign host.
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
Last login: Sun Jan 21 10:35:05 2018
[root@centos ~]# id
uid=0(root) gid=0(root) 组=0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[root@centos ~]# su sauser
[sauser@centos root]$ id
uid=1000(sauser) gid=1000(sauser) 组=1000(sauser) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[sauser@centos root]$
第三节 PAM嵌入式认证模块
Linux-PAM(linux可插入认证模块)是一套共享库,使本地系统管理员可以随意选择程序的认证方式。换句话说:不用(重新编写)重新编译一个包含PAM功能的应用程序,就可以改变它使用的认证机制,升级本地认证机制,也不用修改程序。
I /etc/pam.conf文件
centos 6之后不在使用此文件
每行的格式如下:service-name module-type control-flag module-path arguments
II /etc/pam.d/目录
目录下文件的名字就是服务名称。
vim /etc/pam.d/sshd
配置文件的结构分为四列,依次是:模块类型、控制标记、模块路径、模块参数
模块类型
Linux-PAM有四种模块类型,分别代表四种不同的任务:认证管理(auth),账号管理(account),会话管理(session)和密码(password)管理。一个类型可能有多行。它们按顺序依次由PAM模块调用。
管理方式 |
说明 |
auth |
用来对用户的身份进行识别.如:提示用户输入密码,或判断用户是否为root等. |
account |
对帐号的各项属性进行检查.如:是否允许登录,是否达到最大用户数,或是root用户是否允许在这个终端登录等. |
session |
这个模块用来定义用户登录前的,及用户退出后所要进行的操作.如:登录连接信息,用户数据的打开与关闭,挂载文件系统等. |
password |
使用用户信息来更新.如:修改用户密码. |
控制标记
PAM使用控制标记来处理和判断各个模块的返回值.(在此只说明简单的认证标记)
控制标记 |
说明 |
required |
表示即使某个模块对用户的验证失败,也要等所有的模块都执行完毕后,PAM 才返回错误信息。这样做是为了不让用户知道被哪个模块拒绝。如果对用户验证成功,所有的模块都会返回成功信息。 |
requisite |
与required相似,但是如果这个模块返回失败,则立刻向应用程序返回失败,表示此类型失败.不再进行同类型后面的操作. |
sufficient |
表示如果一个用户通过这个模块的验证,PAM结构就立刻返回验证成功信息(即使前面有模块fail了,也会把 fail结果忽略掉),把控制权交回应用程序。后面的层叠模块即使使用requisite或者required 控制标志,也不再执行。如果验证失败,sufficient 的作用和 optional 相同 |
optional |
表示即使本行指定的模块验证失败,也允许用户接受应用程序提供的服务,一般返回PAM_IGNORE(忽略). |
模块路径
即要调用模块的位置:64位系统一般保存在/lib64/security,如:pam_unix.so
同一个模块,可以出现在不同的类型中,它在不同的类型中所执行的操作都不相同。这是由于每个模块针对不同的模块类型,编制了不同的执行函数。
模块参数
即传递给模块的参数,可以有多个用空格分隔开,如:password required pam_unix.so nullok obscure min=4 max=8 md5
常用PAM模块 |
结合管理类型 |
说明 |
pam_unix.so |
auth |
提示用户输入密码,并与/etc/shadow文件相比对.匹配返回0 |
account |
检查用户的账号信息(包括是否过期等).帐号可用时,返回0. | |
password |
修改用户的密码.将用户输入的密码,作为用户的新密码更新shadow文件 | |
pam_shells.so |
auth account |
如果用户想登录系统,那么它的shell必须是在/etc/shells文件中之一的shell |
pam_deny.so |
account auth password session |
该模块可用于拒绝访问 |
pam_permit.so |
auth account password session |
模块任何时候都返回成功. |
pam_securetty.so |
auth |
如果用户要以root登录时,则登录的tty必须在/etc/securetty之中. |
pam_listfile.so |
auth account passwordsession |
访问应用程的控制开关 |
pam_cracklib.so |
password |
这个模块可以插入到一个程序的密码栈中,用于检查密码的强度. |
pam_limits.so |
session |
定义使用系统资源的上限,root用户也会受此限制,可以通过/etc/security/limits.conf或/etc/security/limits.d/*.conf来设定 |
示例pam_securetty.so
限制root从tty1,tty2,tty5登录(无实际意义,只是演示pam_securetty的用法)
1) 在/etc/pam.d/login中添加如下一行
auth required pam_securetty.so
2) 在/etc/pam.d/securetty中将tty1,tty2,tty5注释即可
这么做其实并不是只限制root用户,也可以将其它用户用此方法来限定,当系统安装完成后,使用此方法来增强一下安全性。
示例pam_listfile.so
仅essun用户可以通过ssh远程登录
1) 在/etc/pam.d/sshd文件中添加一条
auth required pam_listfile.so item=user sense=allow file=/etc/sshdusers onerr=succeed
2) 添加两个用户essun和tom
3) 编辑file指定的文件,添加上一个用户essun
echo "essun" >/etc/sshdusers
使用tom用户登录,可以看到提示输入密码,当输入正确的密码后会提示,就像输入了错误的密码一样。而在使用essun用户登录则不会出现拒绝登录的提示
注1:此处如果root也使用ssh远程连接登录,也会受到pam_listfile.so限制的,但可su root。
注2:在此限制登录帐号,还不如设置sshd的AllowUsers、DenyUsers或直接把其他帐号useradd|usermod -s /sbin/nologin <username>。
man pam_listfile
其实pam模块的使用方法套路都差不多
如想了解更多的PAM模块的用法请man modules
III pam_tally2.so多次登陆失败后锁定帐号
设置Linux用户连续N次输入错误密码进行登陆时,自动锁定X分钟或永久锁定(这里的永久锁定指除非进行手工解锁,否则会一直锁定)。
示例
vim /etc/pam.d/sshd
auth required pam_tally2.so deny=3 unlock_time=300 even_deny_root root_unlock_time=600
解读:SSH连续三次认证失败,锁定5分钟,root用户则锁定10分钟。
格式
pam_tally2.so [file=/path/to/counter] [onerr=[fail|succeed]] [magic_root] [even_deny_root] [deny=n] [lock_time=n] [unlock_time=n] [root_unlock_time=n] [serialize] [audit] [silent] [no_log_info]
1、全局参数
file |
用于指定统计次数存放的位置,默认保存在/var/log/tallylog文件中; |
onerr |
当意外发生时,返加PAM_SUCCESS或pam错误代码,一般该项不进行配置; |
audit |
如果登录的用户不存在,则将访问信息写入系统日志; |
silent |
静默模式,不输出任何日志信息; |
no_log_info |
不打印日志信息通过syslog |
上面的五项全局参数,一般在使用中都不需要单独配置。
2、认证选项
deny |
指定最大几次认证错误,如果超出此错误,将执行后面的策略。如锁定N秒,如果后面没有其他策略指定时,默认永远锁定,除非手动解锁。 |
lock_time |
锁定多长时间,按秒为单位; |
unlock_time |
指定认证被锁后,多长时间自动解锁用户; |
magic_root |
如果用户uid=0(即root账户或相当于root的帐户)在帐户认证时调用该模块发现失败时,不计入统计; |
no_lock_time |
不使用.fail_locktime项在/var/log/faillog中记录用户---按英文直译不太明白,个人理解即不进行用户锁定; |
even_deny_root |
root用户在认证出错时,一样被锁定(该功能慎用,搞不好就要单用户时解锁了) |
root_unlock_time |
root用户在失败时,锁定多长时间。该选项一般是配合even_deny_root一起使用的。 |
认证位置
/etc/pam.d/login中配置只在本地文本终端上做限制;
/etc/pam.d/kde在配置时在kde图形界面调用时限制;
/etc/pam.d/sshd中配置时在通过ssh连接时做限制;
/etc/pam.d/system-auth中配置凡是调用 system-auth 文件的服务,都会生效。
手工解锁
[root@cos7 ~]# pam_tally2 --user liang
Login Failures Latest failure From
liang 4 01/27/18 16:09:58 tty3
[root@cos7 ~]# pam_tally2 --user liang --reset=3
Login Failures Latest failure From
liang 4 01/27/18 16:09:58 tty3
[root@cos7 ~]# pam_tally2 --user liang
Login Failures Latest failure From
liang 3 01/27/18 16:09:58 tty3
[root@cos7 ~]# pam_tally2 --user liang --reset
Login Failures Latest failure From
liang 3 01/27/18 16:09:58 tty3
[root@cos7 ~]# pam_tally2 --user liang
Login Failures Latest failure From
liang 0
[root@cos7 ~]#
IV 温馨提示
如果发生错误,Linux-PAM 可能会改变系统的安全性。这取决于你自己的选择,你可以选择不安全(开放系统)和绝对安全(拒绝任何访问)。通常,Linux-PAM 在发生错误时,倾向于后者。任何的配置错误都可能导致系统整个或者部分无法访问。
配置 Linux-PAM 时,可能遇到最大的问题可能就是 Linux-PAM 的配置文件/etc/pam.d/*被删除了。如果发生这种事情,你的系统就会被锁住。
有办法可以进行恢复,最好的方法就是用一个备份的镜像来恢复系统,或者登录进单用户模式然后进行正确的配置。
第四节 SSH Key登录
密钥形式登录的原理是:利用密钥生成器制作一对密钥(一只公钥和一只私钥)。将公钥添加到服务器的某个账户上,然后在客户端利用私钥即可完成认证并登录。
I 1、制作用户的rsa密钥
ssh-keygen -t rsa #连续三次回车,ssh1只支持rsa1,ssh2支持所有的。
生成密钥时选择默认位置即可,同时可以选择为密钥增加密码(设置密码后,使用密钥时还需要输入密码)。
II 2、下载密钥文件scp、pscp
scp是linux下利用sftp/scp协议跨主机复制文件,不受ssh登录限制,PuTTY中的pscp是Win版scp。
C:\>pscp ctos@192.168.19.19:/home/ctos/.ssh/id_* e:\downloads
ctos@192.168.19.19's password:
id_rsa | 1 kB | 1.6 kB/s | ETA: 00:00:00 | 100%
id_rsa.pub | 0 kB | 0.4 kB/s | ETA: 00:00:00 | 100%
C:\>pscp ctos@192.168.19.19:/home/ctos/.ssh/one.file e:\downloads
ctos@192.168.19.19's password:
C:\>dir e:\downloads
2018/01/25 12:56 1,679 id_rsa
2018/01/25 12:56 391 id_rsa.pub
2018/01/25 12:57 0 one.file
注意:1、路径为绝对路径,未加-r递归参数只能下载文件,不能下载目录。
2、e:\downloads如果不是已存的目录,当文件名处理。
上传示例
pscp e:\Downloads\BaiduNetdiskDownload\putty-0.70cn.zip ctos@192.168.19.19:/home/ctos/abc
pscp -r e:\Downloads\BaiduNetdiskDownload ctos@192.168.19.19:/home/ctos/abc
III 3、配置SSHd
a)、安装公钥文件
mv id_rsa.pub authorized_keys
cat id_rsa.pub >> authorized_keys #这样也行
pscp D:\Toolkit\PuTTY\cos7\id_rsa.pub ctos@192.168.19.19:/home/ctos/.ssh/authorized_keys
为了安全改文件权限
chmod 600 authorized_keys
chmod 700 ~/.ssh
b)、/etc/ssh/sshd_config
开启公钥认证,默认是注释了。
PubkeyAuthentication yes
确认连接成功后,关闭密码认证。
PasswordAuthentication no
IV 4、配置SSH Client
PuTTY
私钥文件格式转换,可以设置使用密码 |
设置私钥文件 |
不要密码或指定密钥了?
Xshell 5+Xftp 5
第五节 PuTTY+Xming
PuTTY将设置存在注册表HKEY_CURRENT_USER/Software/SimonTatham/PuTTY里。
SSHd提供了x11转发功能。Xming是图形转发程序,在linux上服务端,在Windows上装客户端。
第六节 systemctl
进程和作业管理:systemctl命令是系统服务管理器指令,它实际上将service和chkconfig这两个命令组合到一起。
任务 |
旧指令 |
新指令 |
使某服务自动启动 |
chkconfig --level 3 httpd on |
systemctl enable httpd.service |
使某服务不自动启动 |
chkconfig --level 3 httpd off |
systemctl disable httpd.service |
检查服务状态 |
service httpd status |
systemctl status httpd.service systemctl is-active httpd.service |
显示所有已启动的服务 |
chkconfig --list |
systemctl list-units --type=service |
启动某服务 |
service httpd start |
systemctl start httpd.service |
停止某服务 |
service httpd stop |
systemctl stop httpd.service |
重启某服务 |
service httpd restart |
systemctl restart httpd.service |
I systemd服务以root身份运行
第七节 firewall-cmd
[root@cos7 liang]# firewall-cmd --add-port=1521/tcp --permanent
success
[root@cos7 liang]# firewall-cmd --add-port=1158/tcp --permanent
success
[root@cos7 liang]# firewall-cmd --reload
success
[root@cos7 liang]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens32 ens33
sources:
services: ssh dhcpv6-client ntp
ports: 1521/tcp 1158/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
I 示例
systemctl <stop|start|restart|status> firewalld.service #firewall的停止、启动、重启、状态
systemctl disable firewalld.service #禁止firewall开机启动
systemctl enable firewalld.service #启用firewall开机启动
firewall-cmd --state #查看默认防火墙状态(关闭后显示notrunning,开启后显示running)
firewall-cmd --list-service #查看开放的服务
firewall-cmd --list-ports #查看开放的端口
firewall-cmd --zone=public --add-service=ntp --permanent #永久开放public区域的ntp服务
firewall-cmd --zone=public --add-port=1521/tcp #临时开放public区域的tcp协议1521端口
firewall-cmd --zome=public --add-port=5060-5059/udp --permanent #永久开放public区域的udp协议5060-5059端口
firewall-cmd --remove-service=ftp --permanent #永久关闭默认区域的ftp服务。
firewall-cmd --zome=public --remove-port=5060-5059/udp --permanent #永久移除public区域的udp协议5060-5059端口
firewall-cmd --query-service ssh #查询ssh服务状态
firewall-cmd --query-port=1521/tcp #查询Tcp1521商品的状态
firewall-cmd --reload #重新加载配置
firewall-cmd --complete-reload #重启服务加载配置
firewall-cmd --state #查看状态:运行中、未运行。
允许/删除ip 192.168.0.4/24 访问 http
firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.0.4/24" service name="http" accept"
firewall-cmd --permanent --zone=public --remove-rich-rule="rule family="ipv4" source address="192.168.0.4/24" service name="http" accept"
Firewall-config:在GUI更直观一些。
II 区域
[root@centos liang]# firewall-cmd --get-zones #列出所有区域
block dmz drop external home internal public trusted work
[root@centos liang]# firewall-cmd --get-default-zone #注意没有s
Public
[root@centos liang]# firewall-cmd --get-active-zones #列出激活区域
public
interfaces: ens32 ens33
[root@centos liang]# firewall-cmd --get-zone-of-interface=ens32 #查询接口ens32所在区域
Public
firewall-cmd --zone=public --list-all #显示指定区域
firewall-cmd --list-all-zones #显示所有区域
firewall-cmd --list-all #显示激活区域
firewall-cmd --zone=public --add-service=ntp –permanent #永久开放public区域的ntp服务
命令 区域 规则操作 规则效力
未指定则为默认区域 未指明则为临时
规则操作方法:查看list、添加add、删除remove、服务查询query
规则操作对像:服务service、端口port、协议protocol、富规则rich-rule、来源source
drop |
丢弃所有进入的包,而不给出任何响应 |
block |
拒绝所有外部发起的连接,允许内部发起的连接 |
public |
允许指定的进入连接 |
external |
同上,对伪装的进入连接,一般用于路由转发 |
dmz |
允许受限制的进入连接 |
work |
允许受信任的计算机被限制的进入连接,类似workgroup |
home |
同上,类似homegroup |
internal |
同上,范围针对所有互联网用户 |
trusted |
信任所有连接 |
III Help
https://fedoraproject.org/wiki/FirewallD/zh-cn
IV iptables命令
建议使用firewall-cmd命令来配置防火墙
$ /etc/init.d/iptables start # 开启防火墙,或者service iptables start,以下同理
$ /etc/init.d/iptables stop # 停止防火墙
$ /etc/init.d/iptables restart # 重启防火墙
$ /etc/init.d/iptables status # 查看端口状态
$ /etc/init.d/iptables save # 保存配置
$ chkconfig iptables off # 永久关闭防火墙
$ chkconfig iptables on # 永久关闭后启用
语法
iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作
表名 |
动作 | ||
raw |
高级功能,如:网址过滤。 |
ACCEPT |
接收数据包。 |
mangle |
数据包修改(QOS)实现服务质量。 |
DROP |
丢弃数据包。 |
net |
地址转换,用于网关路由器。 |
REDIRECT |
重定向、映射、透明代理。 |
filter |
包过滤,用于防火墙规则。 |
SNAT |
源地址转换。 |
规则链名 |
DNAT |
目标地址转换。 | |
INPUT |
处理输入数据包。 |
MASQUERADE |
IP伪装(NAT),用于ADSL。 |
OUTPUT |
处理输出数据包。 |
LOG |
日志记录。 |
PORWARD |
处理转发数据包。 |
|
|
PREROUTING |
用于目标地址转换(DNAT)。 |
|
|
POSTOUTING |
用于源地址转换(SNAT)。 |
|
|
选项
-t<表>:指定要操纵的表;
-A:向规则链中添加条目;
-D:从规则链中删除条目;
-i:向规则链中插入条目;
-R:替换规则链中的条目;
-L:显示规则链中已有的条目;
-F:清空规则链中已有的条目;
-Z:清空规则链中的数据包计算器和字节计数器;
-N:创建新的用户自定义规则链;
-P:定义规则链中的默认目标;
-p:指定要匹配的数据包协议类型;
-s:指定要匹配的数据包源ip地址;
-j<目标>:指定要跳转的目标;
-i<网络接口>:指定数据包进入本机的网络接口;
-o<网络接口>:指定数据包要离开本机所使用的网络接口。
示例
关闭所有的 INPUT / FORWARD / OUTPUT
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
一设置规则,即生效。
保存配置
service iptables save
重启服务
service iptables restart
查看状态:
iptables -L -n -v
将所有iptables以序号标记显示,执行:
iptables -L -n -v --line-numbers
比如要删除INPUT里序号为8的规则,执行:
iptables -D INPUT 8
清除已有iptables规则
iptables -F
iptables -X
iptables -Z
开放指定的端口
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
#允许本地回环接口(即运行本机访问本机)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #允许已建立的或相关连的通行
iptables -A OUTPUT -j ACCEPT #允许所有本机向外的访问
iptables -A INPUT -p tcp --dport 22 -j ACCEPT #允许访问22端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT #允许访问80端口
iptables -A INPUT -j reject #禁止其他未允许的规则访问
iptables -A FORWARD -j REJECT #禁止其他未允许的规则访问
屏蔽IP
iptables -I INPUT -s 123.45.6.7 -j DROP #屏蔽单个IP的命令
iptables -I INPUT -s 123.0.0.0/8 -j DROP #封整个段即从123.0.0.1到123.255.255.254的命令
iptables -I INPUT -s 124.45.0.0/16 -j DROP #封IP段即从123.45.0.1到123.45.255.254的命令
iptables -I INPUT -s 123.45.6.0/24 -j DROP #封IP段即从123.45.6.1到123.45.6.254的命令
开放22端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
/etc/sysconfig/iptables
-A INPUT -p tcp -m tcp --dport 4000 -j ACCEPT
在文件中录入,命令的前面部分,保存后再重启:service iptables restart
第八节 crond定时任务
systemctl <status|start|stop|restart> crond
I /etc/crontab
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
II /etc/cron.d/
当我们要增加全局性的计划任务时,一种方式是直接修改/etc/crontab。但是,一般不建议这样做,/etc/cron.d目录就是为了解决这种问题而创建的。
除了数字还有几个特殊的符号:
* |
代表所有的取值范围内的数字 |
/ |
代表每的意思,/5表示每5个单位 |
- |
代表从某个数字到某个数字 |
, |
分开几个离散的数字 |
每天的下午4点、5点、6点的5 min、15 min、25 min、35 min、45 min、55 min时执行命令。
5,15,25,35,45,55 16,17,18 * * * root command
每年的一月和四月,4号到9号的3点12分和3点55分执行command。
12,55 3 4-9 1,4 * root command
晚上11点到早上8点之间的每隔两个小时和早上八点
0 23-7/2,8 * * * root command
每隔两个小时(第一个为15,指明每两个小时的第15min中执行一次)
15 */2 * * * root command
系统示例
[root@cos7 ctos]# cat /etc/cron.d/0hourly
# Run the hourly jobs
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
01 * * * * root run-parts /etc/cron.hourly #每小时的第01分钟执行
[root@cos7 ctos]# cat /etc/cron.d/raid-check
# Run system wide raid-check once a week on Sunday at 1am by default
0 1 * * Sun root /usr/sbin/raid-check #星期日的01:00执行
[root@cos7 ctos]# cat /etc/cron.d/sysstat
# Run system activity accounting tool every 10 minutes
*/10 * * * * root /usr/lib64/sa/sa1 1 1 #每10分钟执行
# 0 * * * * root /usr/lib64/sa/sa1 600 6 &
# Generate a daily summary of process accounting at 23:53
53 23 * * * root /usr/lib64/sa/sa2 -A #每天23:53执行
III crontab用户级
-u <user> |
指定用户 |
–e |
修改用户定时任务文件,如果文件不存在会自动创建。 |
–l |
显示用户定时任务文件。 |
-r |
删除用户定时任务文件。 |
-ir |
删除用户定时任务文件前提醒用户。 |
/var/spool/cron/$USER
这个是用户级的,/etc/crontab是系统级的。
[ctos@cos7 ~]$ crontab -e
crontab: installing new crontab
[ctos@cos7 ~]$ crontab -l
*/2 * * * * date>>~/abc.txt
[ctos@cos7 ~]$ ls
[ctos@cos7 ~]$ date
2018年 01月 25日 星期四 14:47:54 CST
[ctos@cos7 ~]$ su
密码:
[root@cos7 ctos]# cat /var/spool/cron/ctos
*/2 * * * * date>>~/abc.txt
[root@cos7 ctos]# exit
exit
[ctos@cos7 ~]$ ls
abc.txt
[ctos@cos7 ~]$ cat abc.txt
2018年 01月 25日 星期四 14:48:01 CST
第九节 系统日志/var/log
/var/log/message |
系统启动后的信息和错误日志 |
/var/log/secure |
与安全相关的日志信息 |
/var/log/maillog |
与邮件相关的日志信息 |
/var/log/cron |
与定时任务相关的日志信息 |
/var/log/boot.log |
守护进程启动和停止相关的日志消息 |
/var/log/wtmp |
该日志文件永久记录每个用户登录、注销及系统的启动、停机的事件, 限last读取。 |
[root@cos7 ctos]# yum list installed sysstat
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
已安装的软件包
sysstat.x86_64 10.1.5-12.el7 @anaconda
最常用的sar工具使用方法为:.
•sar -u 10 8 --检查cpu负载,每10秒采样一次,共采样8次
•sar -d 5 2 --查看磁盘块活动,每5秒采样一次,共采样2次.
•sar -b --查看io传输速率
•sar -q --查看队列长度和load averages,队列越小越好
•sar -B --查看分页信息
•sar -W --查看交换信息
•sar -r --查看空闲内存与空闲交换信息
•sar-n DEV 查看当前服务器的网络流量信息
•sar-r -f /var/log/sa/sa?? 查看历史资源使用 -f
第十节 uptime理解系统负荷
http://www.ruanyifeng.com/blog/2011/07/linux_load_average_explained.html
uptime输出三类信息:系统已运行时间,在线用户,系统负载(1分钟,5分钟,15分钟)
显示"load average"(top与w都有此信息),它的意思是"系统的平均负荷",里面有三个数字,我们可以从中判断系统负荷是大还是小。它们的意思分别是1分钟、5分钟、15分钟内系统的平均负荷,当CPU完全空闲的时候,平均负荷为0;当CPU工作量饱和的时候,平均负荷为1。
什么时候能看出系统负荷比较重呢?等于1的时候,还是等于0.5或等于1.5的时候?如果1分钟、5分钟、15分钟三个值不一样,怎么办?
I 一个类比
首先,假设最简单的情况,你的电脑只有一个CPU,所有的运算都必须由这个CPU来完成。
那么,我们不妨把这个CPU想象成一座大桥,桥上只有一根车道,所有车辆都必须从这根车道上通过。(很显然,这座桥只能单向通行。)
系统负荷为0,意味着大桥上一辆车也没有。
系统负荷为0.5,意味着大桥一半的路段有车。
系统负荷为1.0,意味着大桥的所有路段都有车,也就是说大桥已经"满"了。但是必须注意的是,直到此时大桥还是能顺畅通行的。
系统负荷为1.7,意味着车辆太多了,大桥已经被占满了(100%),后面等着上桥的车辆为桥面车辆的70%。以此类推,系统负荷2.0,意味着等待上桥的车辆与桥面的车辆一样多;系统负荷3.0,意味着等待上桥的车辆是桥面车辆的2倍。总之,当系统负荷大于1,后面的车辆就必须等待了;系统负荷越大,过桥就必须等得越久。
CPU的系统负荷,基本上等同于上面的类比。大桥的通行能力,就是CPU的最大工作量;桥梁上的车辆,就是一个个等待CPU处理的进程(process)。
如果CPU每分钟最多处理100个进程,那么系统负荷0.2,意味着CPU在这1分钟里只处理20个进程;系统负荷1.0,意味着CPU在这1分钟里正好处理100个进程;系统负荷1.7,意味着除了CPU正在处理的100个进程以外,还有70个进程正排队等着CPU处理。
为了电脑顺畅运行,系统负荷最好不要超过1.0,这样就没有进程需要等待了,所有进程都能第一时间得到处理。很显然,1.0是一个关键值,超过这个值,系统就不在最佳状态了,你要动手干预了。
II 经验法则
当系统负荷持续大于0.7,你必须开始调查了,问题出在哪里,防止情况恶化。
当系统负荷持续大于1.0,你必须动手寻找解决办法,把这个值降下来。
当系统负荷达到5.0,就表明你的系统有很严重的问题,长时间没有响应,或者接近死机了。你不应该让系统达到这个值。
III 多路多核CPU
上面,我们假设你的电脑只有1个CPU。如果你的电脑装了2个CPU,会发生什么情况呢?
2个CPU,意味着电脑的处理能力翻了一倍,能够同时处理的进程数量也翻了一倍。
还是用大桥来类比,两个CPU就意味着大桥有两根车道了,通车能力翻倍了。
所以,2个CPU表明系统负荷可以达到2.0,此时每个CPU都达到100%的工作量。推广开来,n个CPU的电脑,可接受的系统负荷最大为n.0。
在系统负荷方面,多核CPU与多CPU效果类似,所以考虑系统负荷的时候,必须考虑这台电脑有几个CPU、每个CPU有几个核心。然后,把系统负荷除以总的核心数,只要每个核心的负荷不超过1.0,就表明电脑正常运行。
查看CPU的总核心数:grep -c 'model name' /proc/cpuinfo
IV 最佳观察时长
三个平均值:1分钟系统负荷、5分钟系统负荷,15分钟系统负荷,应该参考哪个值?
如果只有1分钟的系统负荷大于1.0,其他两个时间段都小于1.0,这表明只是暂时现象,问题不大。
如果15分钟内,平均系统负荷大于1.0(调整CPU核心数之后),表明问题持续存在,不是暂时现象。
所以,你应该主要观察"15分钟系统负荷",将它作为电脑正常运行的指标。
欢迎转载,但请注明内容的来源或URL;
“[转]”篇章,必须保留原始来源且勿添加本blog指向。