Linux-命令上

at是一次性的任务,crond是循环的定时任务

如果 cron.allow 文件存在,只有在文件中出现其登录名称的用户可以使用 crontab 命令。root 用户的登录名必须出现在 cron.allow 文件中,如果这个文件存在的话。系统管理员可以明确的停止一个用户,通过使用 crontab 命令,同时在 cron.deny 文件中列出用户的登录名。如果只有 cron.deny 文件存在,任一名称没有出现在这个文件中的用户可以使用 crontab 命令。

如果以下一个条件成立,用户将不能使用 crontab 命令:

  • cron.allow 文件和 cron.deny 文件不存在(只允许 root 用户)。 
  • cron.allow 文件存在,但用户的登录名并不列在其中。 
  • cron.deny 文件存在,并且用户的登录名列在其中。

如果 cron.allow 和 cron.deny 文件都不存在,只有被 root 用户授权的人可以用 crontab 命令提交一个作业。

1、定时任务crond介绍
1)定时任务软件种类

at 适合仅执行一次就结束的调度命令,需要启动一个后端的atd服务。

crontab 需要启动一个服务crond才行,crond服务通过crontab命令实现。

anacron 无法周期性执行,只能以天为周期,但有个特点,在关机状态下未执行的任务,下次开机时可以补上执行

注:crontab为最常用的定时任务。

2)crontab工作

运行linux后,开机自启动crond任务,系统会每分钟检查是否有要执行的任务工作(循环检测)

默认系统中可以登陆的用户,都可以使用crontab定义计划任务。不过,可以通过/etc/cron.allow文件限制权限。

3)crontab支持两种状态:

a.直接编写计划任务;

b.使用目录的方式,放在目录里面的都会定时执行,定时目录可在/etc/crontab中设定。

2、crond定时任务限权

可对各用户使用定时任务进行管理

1)拒绝用户使用crontab任务

在/etc/cron.deny中添加要拒绝的用户名,格式如下:

listen

nobody

noaccess

username1

username2

username3

.

2)允许用户访问crontab任务

在/etc/cron.allow中添加要允许的用户名,格式如下:

root

username1

username2

.

3)定期执行一个目录下的文件

在/etc/crontab中添加目录,格式如下:

01 * * * * root run-parts 目录

注:使用run-parts可定义定期执行的目录

4)限权测试

1>添加用户

[root@test ~]# useradd test

[root@test ~]# echo 123456 |passwd test--stdin  #<==非交互模式创建密码

Changing password for user test.

passwd: all authentication tokensupdated successfully.

2>拒绝测试

[root@test ~]# cat /etc/cron.deny 

test

[root@test ~]# 

[root@test ~]# su - test

[test@test ~]$ crontab -e

You (test)are not allowed to use this program (crontab)

See crontab(1) for more information

在cron.deny中加入用户后,该用户没有权限编辑定时任务

3>允许测试

[root@test ~]# cat /etc/cron.allow

test

[root@test ~]# su - test

[test@test ~]$ crontab -e   #<==test用户编辑成功

*/1 * * * * echo successful >/tmp/a.log

[test@test ~]$ crontab -l

*/1 * * * * echo successful >/tmp/a.log

在cron.allow中加入用户后,该用户能编辑定时任务

4>清空允许用户

[test@test ~]$ su - root

Password: 

[root@test ~]# echo >/etc/cron.allow

[root@test ~]# su - test

[test@test ~]$ crontab -l  #<==test用户连查看的权限都没有

You (test)are not allowed to use this program (crontab)

See crontab(1) for more information

[test@test ~]$ cat /etc/cron.deny

test

清空cron.allow允许用户后,该用户又被cron.deny拒绝,

得出结论:/etc/cron.allow优先于/etc/cron.deny配置

3、Crontab用法

[root@yang1 data]# crontab --help   #<==注:crontab –l –e都是直接操作/var/spool/cron/下当前用户名的文件

usage: crontab [-u user] file    #<==指定某用户如crontab –u yang2 –e,编辑yang2家目录下的crontab

    crontab [-u user] [ -e | -l | -r ]

        (default operation is replace,per 1003.2)

    -e   (edit user's crontab)  #<==编辑当前用户的定时任务

    -l   (list user's crontab)  #<==查看当前用户的定时任务

    -r   (delete user's crontab)  #<==删除定时任务

    -i   (prompt before deletinguser's crontab) #<==删除crontab文件内容,删前会有提示

    -s   (selinux context)

注:crontab –e 编辑定时任务,退出时可以检查语法,直接编辑/var/spool/cron/root不能。如果大批量添加任务,则使用echo追加。

cron执行的每一项工作都会被纪录到/var/log/cron这个日志文件中,可以从这个文件查看命令执行的状态。

4、Crontab命令的书写格式

  *      *     *      *     *    /bin/sh /scripts/yy.sh

  分     时     日     月     周    命令和文件路径

(00-59)  (0-23)   (1-31)   (1-12)    (0-6)         

所用符号表示意思

星号每的意思

减号连续一段时间,如:00 17-19 * * * cmd  每天下午17点,18点,19点执行一次命令

逗号多个时间段,如:00 10-11,17-19 * * * cmd 每天的上午10,11点整,下午的17,18,19点整执行一次命令

/n n代表数字,指每隔n时间执行一次,如: */2 * * * * cmd 每隔2分钟执行一次命令

1)举例:

30 12-16/2 * ** cmd 

每天的中午12点到下午4点间,每隔2小时执行一次

* 23-7/1 * * 25pxd 

注:这是一个错误的命令

日和周不能同时用,若要以月为间隔,则日或周必有一个有值

其它如:小时上有值,则分钟上也要有值

*/1 * * ** echo yangrong >>/var/log/yy > /dev/null 2>&1

每隔一分钟把yangrong打印到yangrong1文件中,但该命令无法执行,因为>>与>/dev/null不可同时使用

2)/dev/null 2>&1解释

0是标准输入    使用<或<<

1是标准输出    使用>或>>

2是标准错误输出  使用2>或2>>

>/dev/null 2>&1  即错误输出与标准输出全部重定向到空,可以写成1>/dev/null 2>/dev/null

3)关于重定向的作用

重定向到空可以避免碎片文件占用inode资源

重定向到一个指定log里,可以看任务是否执行

4)关于导致磁盘inode满情况分析

定时任务执行成功or失败时,程序会向上层发送mail,由于平时工作中不打开sendmail功能,所以邮件会存储在临时目录/var/spool/clientmqueue,随着执行的任务次数多,文件也会越来越多,直到某一天,添加文件时,提示No space left on device,主要问题原因不在于垃圾文件会占很大空间,而在于每个文件会占用inode节点。(centos6.4默认不装sendmail,可能不会导致这个问题发生)。

所以crontab规则后需加 /dev/null 2>&1。

注:>> 与 >/dev/null 2>&1不可同时存在,不然无法执行

5)重启crond服务

/etc/init.d/crond status  #查看当前运行状态

/etc/init.d/crond restart #重启

/etc/init.d/crond reload  #平滑重启

5、定时服务器时间同步

 1)手动同步

[root@yang1 data]# which ntpdate

/sbin/ntpdate

[root@yang1 data]# /sbin/ntpdate time.windows.com

2)自动同步(使用定时任务)

#sync systime by yangrong at 2013-9-4         

*/5 * * * * /sbin/ntpdate time.windows.com>/dev/null 2>&1

注:当局域网内的服务器足够多时(500+),则需自己在局域网搭建ntp server

 用下面的命令可以进行时钟同步一下,用timedatectl核查

 ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

6、写定时任务注意点:

掌握了下面7点,写定时任务就不在犯错。

序号

注意点

1

每个任务添加注释,谁写的,什么时间写的,完成什么需求?

2

执行脚本使用/bin/sh(防止脚本无执行权限),要执行的文件路径是从根开始的绝对路径(防止找不到文件)

3

尽量把要执行的命令放在脚本里,然后把脚本放在定时任务里。对于调用脚本的定时任务,可以把标准输出错误输出重定向到空。

4

定时任务中带%无法执行,需要加\转义

5

如果时上有值,分钟上必须有值

6

日和周不要同时使用,会冲突

7

>>与>/dev/null 2>&1不要同时存在

书写举例:

#backup mysql byyangrong at 2013-9-4

30 4 * * * /bin/shtar_mysql.sh >/dev/null 2>&1 

7、cron和anacron的区别及anacron配置

Linux 中怎么设置计划任务:cron 与 anacron

作为系统管理员,为了系统的安全我们希望服务器定期自动执行一些操作,比如每天自动备份系统文件,定期备份数据库,以及在未来某天让系统自动关机…………Linux就该这么学,linux下有很多命令能帮我们在未来某个特定时间让系统实现上述的操作,以及让系统定期执行某些操作。

在本篇中,我们会解释 cron 和 anacron,并向你展示如何在 Linux 中设置 anacron。我们也会比较这两个工具。

  1. cron 在 Linux 设置时间任务
  1. 第一: cron 介绍

1、cron - 是一个用于运行计划任务如系统备份、更新等的守护进程。它适合在那些 24X7 不间断运行的机器如服务器上运行的计划任务。

2、命令/脚本被写在 cron 任务脚本中,它是在crontab 文件中被安排的。系统默认的 cromtab 文件是/etc/crontab ,但是每个用户也可以创建自己的 cromtab 文件来在特定时间运行用户定义的命令。

  1. 第二 :  cron 如何设置

1、命令合使用方法

    #crontab -u <-l, -r, -e>

     -u指定一个用户     -l列出某个用户的任务计划     -r删除某个用户的任务     -e编辑某个用户的任务

2、创建一个定时任务

要创建一份个人crontab 文件,只要输入:

     # crontab -e

        30 3 * * *  /bin/tar -jcf /tmp/backup.tar.gz  /etc

            // 每天早上3点,备份/etc目录

     # crontab -l 

END

  1. 在 Linux 中设置 anacron
  1. 第一: anacron介绍

1、anacron 用于以天为单位的频率运行命令。它的工作与 cron 稍有不同,它假设机器不会一直开机。

2、cron 也适合在那些不会 24X7 运行如笔记本以及桌面电脑的机器上运行每日、每周以及每月的计划任务(LCTT 译注:不适合按小时、分钟执行任务)。

3、假设你有一个计划任务(比如备份脚本)要使用 cron 在每天半夜运行,也许你以及睡着,那时你的桌面/笔记本电脑已经关机。你的备份脚本就不会被运行。

4、如果你使用 anacron,你可以确保在你下次开启桌面/笔记本电脑的时候,备份脚本会被执行。

  1. 第二 :anacron 如何在 Linux 设置

1、anacron命令方法

anacron 任务被列在 /etc/anacrontab 中,任务可以使用下面的格式(anacron 文件中的注释必须以 # 号开始)安排。

#period   delay   job-identifier   command

  *************************************************

1.1 : period      - 这是任务的频率,以天来指定,或者是

     @daily 、@weekly、@monthly 代表每天、每周、每月一次。

     你也可以使用数字:1 - 每天、7 - 每周、30- 每月,或者N - 几天。

1.2:  delay        - 这是在执行一个任务前等待的分钟数。

1.3:  job-id       - 这是写在日志文件中任务的独特名字。

1.4:  command - 这是要执行的命令或 shell 脚本。

2 、如何看示列文件

要浏览示例文件,输入:

$ ls -l /var/spool/anacron/ 

total 12 

-rw------- 1 root root 9 Jun  1 10:25 cron.daily 

-rw------- 1 root root 9 May 27 11:01 cron.monthly 

-rw------- 1 root root 9 May 30 10:28 cron.weekly

anacron 会检查任务是否已经在 period 字段指定的时间被被执行了。如果没有,则在等待 delay 字段中指定的分钟数后,执行 command字段中指定的命令。

一旦任务被执行了,它会使用 job-id (时间戳文件名)字段中指定的名称将日期记录在 /var/spool/anacron 目录中的时间戳文件中。

3、 现在让我们看一个例子。

这个会每天运行 /home/aaronkilik/bin/backup.sh 脚本:

@daily    10    example.daily   /bin/bash /home/aaronkilik/bin/backup.sh

当机器在 backup.sh 期望被运行时是关机的,anacron 会在机器开机十分钟之后运行它,而不用再等待 7 天。

  1. 第三 : anacrontab 文件的重要变量

START_HOURS_RANGE 

- 这个设置任务开始运行的时间范围(也就是任务只在这几个小时内运行)。

RANDOM_DELAY

- 这定义添加到用户定义的任务延迟的最大随机延迟(默认为 45)。

这是你的 anacrontab 文件可能看上去的样子。

Anacron – /etc/anacrontab :

END

  1. cron 以及 anacron 的比较
  1. cron 和 anacron 主要的区别在于 cron 能在那些持续运行的机器上有效地运行,而 anacron 是针对那些会在一天内或者一周内会关机的机器。

  1. 详解anacron调用

anacron命令开机唤醒计划任务

通常对于一台24小时不停歇的Linux服务器来说,正常的计划任务都是通过crontab或at命令来执行的。但是当某天因维护等原因需要对服务器进行关机升级的时候,原本该段时间(关机时间段)内需要执行的计划任务就会在开机后被推迟到第二天的运行时间点再执行,那么相当于当天的计划任务就被推迟了,这种情况在某些场景内是不可接受的。这时候就可以使用anacron命令来使得在系统重新开机后,把关机时间内的计划任务执行一次。anacron命令实际是依赖于crond服务实现的。

anacron命令的使用

1、命令格式

anacron [options] [job]

2、常用选项

-s:开始所有的jobs,并根据时间戳判断是否开始相应的工作job;
-f:强制进行,忽略时间戳的对比;
-n:立即进行未进行的任务,忽略延迟等待时间;
-u:仅升级相应的执行时间戳,实际不进行任何工作;
job:/etc/anacrontab文件中定义的各项工作名称;

3、anacron任务的配置

与anacron任务运行的相关配置文件包括:
/etc/anacrontab、/var/spool/anacron/cron.daily、/etc/cron.hourly/0anacron及/etc/cron.d/0hourly。

其中/etc/anacrontab文件为anacron任务的配置文件,其内容如下:

SHELL=/bin/sh

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=root

# the maximal random delay added to the base delay of the jobs

RANDOM_DELAY=45

# the jobs will be started during the following hours only

START_HOURS_RANGE=3-22

#period in days   delay in minutes   job-identifier   command

1   5   cron.daily      nice run-parts /etc/cron.daily

7   25  cron.weekly     nice run-parts /etc/cron.weekly

@monthly 45 cron.monthly        nice run-parts /etc/cron.monthly

1   0   test.daily      /bin/bash /tmp/anacron.sh

前三行为定义anacron任务的基本环境,一般变动不大,其后两行表示:
RANDOM_DELAY=45:设置为anacron任务添加的随机延迟的最大值,单位为分钟,一个anacron任务的运行的总延迟时间为RANDOM_DELAY+Base_delay;
START_HOURS_RANGE=3-22:设置anacron任务执行的时间范围,此处表示anacron任务只能在3am-22pm的时间范围内执行;

在下面为anacron任务的配置行,每一行对应一个anacron任务,对应每列含义为:
period in days:周期天数,指任务在多少天内执行一次,7表示七天内执行一次,可以使用@daily、@weekly、@monthly来表示周期;
delay in minutes:延迟时间,单位为分钟;
job-identifier:任务标识,这个与/var/spool/anacron/ 目录下的时间戳文件名相一致,anacron任务通过此标识来获取对应的时间戳判断是否执行该任务;
COMMAND:anacron任务执行的内容;

4、anacron任务的工作流程

下面梳理下anacron工程的流程,以便更好理解anacron任务的工作。这里以Centos 6.8为系统背景对相关的anacron任务流程进行描述。

首先当系统启动时,系统调度服务crond会执行/etc/cron.d/0hourly中的设置:

[root@localhost ~]# cat /etc/cron.d/0hourly

SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=root

HOME=/

01 * * * * root run-parts /etc/cron.hourly  #每小时的第1分钟执行一次/etc/cron.hourly目录中的脚本文件

而在/etc/cron.hourly目录下包含0anacron脚本文件,其内容为:

[root@localhost ~]# ll /etc/cron.hourly/

total 4

-rwxr-xr-x. 1 root root 409 Aug 24  2016 0anacron

[root@localhost ~]# cat /etc/cron.hourly/0anacron

#!/bin/bash

# Skip excecution unless the date has changed from the previous run

if test -r /var/spool/anacron/cron.daily; then      #判断对应的时间戳文件是否可读

    day=`cat /var/spool/anacron/cron.daily`    #随后读取对应的时间戳并赋值给day

fi

if [ `date +%Y%m%d` = "$day" ]; then      #判断当前时间戳是否与读取的时间戳相一致,如果相同则退出脚本;

    exit 0;

fi

# Skip excecution unless AC powered    #在电池模式不执行anacron任务;

if test -x /usr/bin/on_ac_power; then  

    /usr/bin/on_ac_power &> /dev/null

    if test $? -eq 1; then

    exit 0

    fi

fi

/usr/sbin/anacron -s      #执行anacron任务

上述脚本的最后一行/usr/sbin/anacron -s即表明了开始执行/etc/anacrontab里面的anacron任务了,此时便会读取/etc/anacrontab文件的内容:

SHELL=/bin/sh

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=root

# the maximal random delay added to the base delay of the jobs

RANDOM_DELAY=5

# the jobs will be started during the following hours only

START_HOURS_RANGE=3-22

#period in days   delay in minutes   job-identifier   command

1   5   cron.daily      nice run-parts /etc/cron.daily

7   25  cron.weekly     nice run-parts /etc/cron.weekly

@monthly 45 cron.monthly        nice run-parts /etc/cron.monthly

1   0   test.daily      /bin/bash /tmp/anacron.sh

该文件最后一行表示,该anacron任务,在每天3am-22pm范围内执行1次,并且其delay时间为RANDOM_DELAY+delay in minutes,即5+0,该anacron任务对应的执行时间戳文件为test.daily(可自定义),在执行前会将执行时间戳文件的日期与当前日期作比较,如果超过1天(含1天)的话就执行anacron任务。

所以根据上述描述,anacron任务的工作流程可以总结为:
1、系统启动后,crond服务执行每小时调度任务/etc/cron.d/0hourly来执行/etc/cron.hourly/0anacron 任务。
2、/etc/cron.hourly/0anacron 首先判断今天是否已经运行过anacron任务,随后判断系统是否运行在电池模式,如果结果都为否,则执行/usr/sbin/anacron -s命令。
3、随后anacron命令由/etc/anacrontab文件分析到test.daily这个任务的工作间隔为1天;
4、从anacron命令从/var/spool/anacron/test.daily文件中取出此anacron任务最近一次运行时间戳;
5、对比当前时间戳与上一个步骤读取的时间戳,如差异天数为1天或以上,则准备运行命令;
6、在延迟时间过后,开始运行相关的命令,即/bin/bash /tmp/anacron.sh
7、运行完毕后,修改对应的时间戳文件为当前时间,anacron程序结束。

核查的顺序:

  1. crond服务是否启动:systemctl status crond
  2. 在/etc的下面是否有cron.allow和cron.deny,核查权限;
  3. 使用crontab –l核查任务配置,注意命令行的命令能够正确执行,特别是还行权限、目录及大小写正确
  4. 核查定时任务的相应的服务,是否有日志等信息,显示定时启动过、日志正常等,特别是针对安全服务等。

16、X11的配置

屏保的设置检查。

Application—System Tools—Setting—Hardware—Power Saving—Blank screen—never

用termset可以进行设定。

17、进程、服务、多余的程序

1、用ps  –aux 命令核查各种进程,用|grep mysql等进行过滤

2、用setup进行服务核查。

3、用systemctl | grep running核查,用|grep sshd核查某个服务

4、用systemctl status 服务名,核查其状态;

[root@localhost vm]# systemctl status sshd

● sshd.service - OpenSSH server daemon

   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)

   Active: active (running) since Sun 2021-11-14 03:45:10 PST; 3h 11min left

     Docs: man:sshd(8)

           man:sshd_config(5)

 Main PID: 926 (sshd)

   CGroup: /system.slice/sshd.service

           └─926 /usr/sbin/sshd -D

Nov 14 03:45:10 localhost.localdomain systemd[1]: Starting OpenSSH server daemon...

Nov 14 03:45:10 localhost.localdomain sshd[926]: Server listening on 0.0.0.0 port 22.

Nov 14 03:45:10 localhost.localdomain sshd[926]: Server listening on :: port 22.

Nov 14 03:45:10 localhost.localdomain systemd[1]: Started OpenSSH server daemon.

Nov 14 03:53:16 localhost.localdomain sshd[2855]: Accepted password for root from 192.168.5.226 port 59573 ssh2

5、常用的服务:sshd、firewalld、vsftpd、crond、mysqld、httpd、rsyslogd、auditd、ntpd、ntpdate、chronyd、network、NetworkManager、java等;多余的服务如:sendmail、ftp、telnet、dns server(明确说明了不需要)、finger等

6、核查多余的程序,可以使用:yum list installed,也可以使用:rpm –qa、-ql。如果给定的条件查询哪个是多余的,使用grep进行过滤。

18、一些强调的实用配置核查

1、确保配置了失败密码尝试的锁定

在n次不成功的连续登录尝试后锁定用户ID可减轻暴力对系统的密码攻击

查看 ’/etc/pam.d/password-auth‘ 和 ’/etc/pam.d/system-auth‘文件

并确认 pam_faillock.so 周围有 pam_unix.so    pam_unix.so 是 [success=1 default=bad]

auth required pam_faillock.so preauth audit silent deny=5 unlock_time=900

auth [success=1 default=bad] pam_unix.so

auth [default=die] pam_faillock.so authfail audit deny=5 unlock_time=900

auth sufficient pam_faillock.so authsucc audit deny=5 unlock_time=900

2、限制密码重用次数

编辑/etc/pam.d/password-auth 和 /etc/pam.d/system-auth

password required pam_pwhistory.so remember=5

3、确定密码的加密算法 SHA-512

编辑/etc/pam.d/password-auth 和 /etc/pam.d/system-auth

password    sufficient    pam_unix.so     sha512

4、确保对su命令的访问受到限制

编辑/etc/pam.d/su

auth required pam_wheel.so use_uid

编辑/etc/group

将允许的用户加入wheel组,这里以root和redhat用户为例

wheel:x:10:root,redhat

19、日志及日志保护的核查

1、日志文件说明 

日志的功能
用于记录系统、程序运行中发生的各种事件
通过阅读日志,有助于诊断和解决系统故障

日志文件的分类
内核及系统日志
由系统服务syslog统一进行管理,日志格式基本相似
用户日志
记录系统用户登录及退出系统的相关信息
程序日志
由各种应用程序独立管理的日志文件,记录格式不统一

/var/log/messages — 包括整体系统信息,其中也包含系统启动期间的日志。此外,mail,cron,daemon,kern和auth等内容也记录在var/log/messages日志中。
/var/log/dmesg — 包含内核缓冲信息(kernel ring buffer)。在系统启动时,会在屏幕上显示许多与硬件有关的信息。可以用dmesg查看它们。
/var/log/auth.log — 包含系统授权信息,包括用户登录和使用的权限机制等。
/var/log/boot.log — 包含系统启动时的日志。
/var/log/daemon.log — 包含各种系统后台守护进程日志信息。
/var/log/dpkg.log – 包括安装或dpkg命令清除软件包的日志。
/var/log/kern.log – 包含内核产生的日志,有助于在定制内核时解决问题。
/var/log/lastlog — 记录所有用户的最近信息。这不是一个ASCII文件,因此需要用lastlog命令查看内容。
/var/log/maillog /var/log/mail.log — 包含来着系统运行电子邮件服务器的日志信息。例如,sendmail日志信息就全部送到这个文件中。
/var/log/user.log — 记录所有等级用户信息的日志。
/var/log/Xorg.x.log — 来自X的日志信息。
/var/log/alternatives.log – 更新替代信息都记录在这个文件中。
/var/log/btmp – 记录所有失败登录信息。使用last命令可以查看btmp文件。例如,”last -f /var/log/btmp | more“。
/var/log/cups — 涉及所有打印信息的日志。
/var/log/anaconda.log — 在安装Linux时,所有安装信息都储存在这个文件中。
/var/log/yum.log — 包含使用yum安装的软件包信息。
/var/log/cron — 每当cron进程开始一个工作时,就会将相关信息记录在这个文件中。
/var/log/secure — 包含验证和授权方面信息。例如,sshd会将所有信息记录(其中包括失败登录)在这里。
/var/log/wtmp或/var/log/utmp — 包含登录信息。使用wtmp可以找出谁正在登陆进入系统,谁使用命令显示这个文件或信息等。
/var/log/faillog – 包含用户登录失败信息。此外,错误登录命令也会记录在本文件中。

除了上述Log文件以外, /var/log还基于系统的具体应用包含以下一些子目录:
/var/log/httpd/或/var/log/apache2 — 包含服务器access_log和error_log信息。
/var/log/lighttpd/ — 包含light HTTPD的access_log和error_log。
/var/log/mail/ – 这个子目录包含邮件服务器的额外日志。
/var/log/prelink/ — 包含.so文件被prelink修改的信息。
/var/log/audit/ audit.log — 包含被 Linux audit daemon储存的信息。
/var/log/samba/ – 包含由samba存储的信息。
/var/log/sa/ — 包含每日由sysstat软件包收集的sar文件。
/var/log/sssd/ – 用于守护进程安全服务。


登录记录:/var/log/wtmp      记录登录者讯录,二进制文件,须用last来读取内容    who -u /var/log/wtmp 查看信息

(命令last有两个可选参数:last -u 用户名 显示用户上次登录的情况。last -t 天数 显示指定天数之前的用户登录情况。

用who a核查,w命令、users命令)

引导日志:/var/log/boot.log   记录开机启动讯息,dmesg | more

2、内核及系统日志


由系统服务 rsyslogd 统一管理
软件包:rsyslog-7.4.7-16.el7.x86_64
主要程序:/sbin/rsyslogd
配置文件:/etc/rsyslog.conf
日志消息的级别
0 EMERG(紧急):会导致主机系统不可用的情况
1 ALERT(警告):必须马上采取措施解决的问题
2 CRIT(严重):比较严重的情况
3 ERR(错误):运行出现错误
4 WARNING(提醒):可能会影响系统功能的事件
5 NOTICE(注意):不会影响系统但值得注意
6 INFO(信息):一般信息
7 DEBUG(调试):程序或系统调试信息等

安全日志
保存了用户登录、退出系统等相关信息
/var/log/lastlog:最近的用户登录事件
/var/log/wtmp:用户登录、注销及系统开、关机事件
/var/run/utmp:当前登录的每个用户的详细信息
/var/log/secure:与用户验证相关的安全性事件
分析工具部分命令
users 、who、w、last、lastb
由相应的应用程序独立进行管理
Web服务:/var/log/httpd/
access_log、error_log
代理服务:/var/log/squid/
access.log、cache.log、
FTP服务:/var/log/xferlog
查看工具部分命令
文本查看、grep过滤检索、Webmin管理套件中查看
awk、sed等文本过滤、格式化编辑工具
Webalizer、Awstats等专用日志分析工具

日志文件管理方案:
及时作好备份和归档
延长日志保存期限
控制日志访问权限
日志中可能会包含各类敏感信息,如账户、口令等
集中管理日志:将服务器的日志文件发到统一的日志文件服务器,便于日志信息的统一收集、整理和分析、杜绝日志信息的意外丢失、恶意篡改或删除

3、日志管理配置


记录日志服务的主配置文件:/etc/rsyslog.conf

第一块:Modules模块加载

第二块:Global Directory全局文件夹配置

第三块:rules规则
服务.级别 记录的文件及路径 //级别包括8个级别

四、建立日志服务器
如何建立日志同步服务器
1.说明 (日志发送机+日志服务器)(日志发送机就是传统的服务器,需要外发自己的日志)

2.本地存日志---同步---远程存日志

2.确定日志发送机3件事情:1)发什么日志? 2)怎么发?3)发给谁?
登录用户操作 日志协议514 目标服务器信息

确定日志服务器3件事情:1)确保日志服务开启 2)收谁的? 3)怎么收?
配置接收日志选项 来源IP 建立指定路径

-日志发送机:vi /etc/rsyslog.conf 81行

日志接收服务器操作:

-日志服务器(接收)
配置文件修改 vi /etc/rsyslog.conf

15-16行UDP去掉# 19-20行TCP去掉# //注意,注释是有讲究的,空格
查看开启以下象如下内容示例
##Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514

##Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514

确定全局日志配置文件的文件夹状态:
第36行,确认状态不要注释
$IncludeConfig /etc/rsyslog.d/*.conf

内容如下:
格式: :属性, 比较操作符, "值" 日志文件路径

属性包括:fromhost,fromhost-ip,msg,hostname
操作符包括:contains,isequal,startswith

例如:

:fromhost-ip, isequal, “172.18.11.67” /var/log/receive/sec67denglu.log

注:子文件夹及文件不需要手动建立,重启服务后会自动生成。

重启服务并观察端口 systemctl restart rsyslog
并检查是否生成receive文件夹及log文件(发送机操作触发一下)

日志发送机操作
vi /etc/rsyslog.conf,找到81行,添加
authpriv.* @@172.18.11.76:514

重启服务systemctl restart rsyslog

远程登录查看日志变化是否同步

作业:
1、两台LINUX建立日志实时同步。
2、是

建立LAMP架构WEB服务器
[root@A ~]# yum -y install httpd*
[root@A ~]# yum -y install mariadb*
[root@A ~]# yum -y install php php-gd php-xml php-mysqlnd rsyslog-mysql
[root@A ~]# yum -y install libcurl-devel net-snmp-devel

[root@A ~]# systemctl enable mariadb.service
[root@A ~]# systemctl start mariadb.service
[root@A ~]# mysqladmin -u root password 9865321

[root@A ~]# systemctl enable httpd.service
[root@A ~]# systemctl start httpd.service
[root@A ~]# cd /var/www/html/
[root@A html]# vim test.php
<?php
phpinfo();
?>

 针对日志服务器的设置;

cat /etc/syslog.conf查看是否有对应配置

检查方法:配置了远程日志服务器为符合

配置方法:1、参考配置操作

          修改配置文件vi /etc/syslog.conf,

          加上这一行:

          *.* @192.168.0.1

          可以将"*.*"替换为你实际需要的日志信息。比如:kern.* / mail.* 等等;可以将此处192.168.0.1替换为实际的IP或域名。

          重新启动syslog服务,执行下列命令:

          services syslogd restart

          2、补充操作说明

          注意:*.*和@之间为一个Tab

4.audit日志的管理

通过auditd,系统审核允许系统管理员监视其系统这样他们就可以检测到未经授权的数据访问或修改。

默认情况下,auditd将审核SELinux AVC拒绝、系统登录、帐户修改和身份验证事件。事件将记录到 /var/log/audit/audit.log

 需要通过核查:auditctl e,核查audit是否是使能状态;

  1. 配置文件:
  • /etc/audit/auditd.conf
  • /etc/audit/rules.d/audit.rules
  • /etc/audit/audit.rules     # 根据/etc/audit/rules.d/audit.rules自动生成
  1. 配置开机启动

systemctl enable  auditd

 

  1. 配置规则 (man auditctl)

规则类型可分为:

控制规则:控制audit系统的规则;

文件系统规则:也可以认为是文件监控,可以监控一个特定文件或者一个路径。

系统调用规则:可以记录特定程序的系统调用。

1. 控制规则:

-b  设置在内核中audit缓冲空间的最大值。

-f   这个选项来决定内核如何处理critical erros:0=silent 1=printk 2=panic.默认值为1。

-e  设置使能标志,设置为0,为关闭了audit,设置为1,则开启audit;当设置为2时,表示锁定,一般在设置完其他规则后最后设置,防止其他人修改规则;任何修改规则的行为都会被拒绝,并且记录审计日志,只有当重启系统后,这个使能标志才可以被修改。

 

2. 文件系统规则

auditctl -w path -p permissions -k key_name

  • -w : 目录或者文件路径
  • -p: 描述文件系统监视将触发的权限访问类型,r=读取,w=写入,x=执行,a=属性更改。
  • -k:  设置审核规则的筛选关键字

 

3. 系统调用规则

auditctl -a [list,action|action,list] -S [Syscall name or number|all] -F field=value -k key_name

  • -a: action和list 明确一个事件被记录。action可以为always或者never,list明确出对应的匹配过滤,list可以为:task,exit,user,exclude,filesystem。
  • -Ssystem_call 明确出系统调用的名字,几个系统调用可以写在一个规则里,如-S xxx -S xxx。系统调用的名字可以在/usr/include/asm/unistd_64.h文件中找到。
  • -F:  field=value 作为附加选项,修改规则以匹配特定架构、GroupID,ProcessID等的事件。具体有哪些字段,可以参考man linux  https://linux.die.net/man/8/auditctl 

usage: auditctl [options]

    -a <l,a>            Append rule to end of <l>ist with <a>ction

    -A <l,a>            Add rule at beginning of <l>ist with <a>ction

    -b <backlog>        Set max number of outstanding audit buffers

                        allowed Default=64

    -c                  Continue through errors in rules

    -C f=f              Compare collected fields if available:

                        Field name, operator(=,!=), field name

    -d <l,a>            Delete rule from <l>ist with <a>ction

                        l=task,exit,user,exclude

                        a=never,always

    -D                  Delete all rules and watches

    -e [0..2]           Set enabled flag

    -f [0..2]           Set failure flag

                        0=silent 1=printk 2=panic

    -F f=v              Build rule: field name, operator(=,!=,<,>,<=,

                        >=,&,&=) value

    -h                  Help

    -i                  Ignore errors when reading rules from file

    -k <key>            Set filter key on audit rule

    -l                  List rules

    -m text             Send a user-space message

    -p [r|w|x|a]        Set permissions filter on watch

                        r=read, w=write, x=execute, a=attribute

    -q <mount,subtree>  make subtree part of mount point's dir watches

    -r <rate>           Set limit in messages/sec (0=none)

    -R <file>           read rules from file

    -s                  Report status

    -S syscall          Build rule: syscall name or number

    -t                  Trim directory watches

    -v                  Version

    -w <path>           Insert watch at <path>

    -W <path>           Remove watch at <path>

    --loginuid-immutable  Make loginuids unchangeable once set

    --reset-lost         Reset the lost record counter

  1. 配置实例
  1. 记录系统的日期和时间的修改

 vim + /etc/audit/rules.d/audit.rules

-a always,exit -F arch=b64 -S adjtimex -S settimeofday -k time-change

-a always,exit -F arch=b32 -S adjtimex -S settimeofday -S stime -k timechange

-a always,exit -F arch=b64 -S clock_settime -k time-change

-a always,exit -F arch=b32 -S clock_settime -k time-change

-w /etc/localtime -p wa -k time-change

 

  1. 记录用户和组的修改的事件

-w /etc/group -p wa -k identity

-w /etc/passwd -p wa -k identity

-w /etc/gshadow -p wa -k identity

-w /etc/shadow -p wa -k identity

-w /etc/security/opasswd -p wa -k identity

 

  1. 记录网络环境修改时间

-a always,exit -F arch=b32 -S sethostname -S setdomainname -k system-locale

-w /etc/issue -p wa -k system-locale

-w /etc/issue.net -p wa -k system-locale

-w /etc/hosts -p wa -k system-locale

-w /etc/sysconfig/network -p wa -k system-locale

-w /etc/sysconfig/network-scripts/ -p wa -k system-locale

 

  1. 记录登录和登出事件

-w /var/log/lastlog -p wa -k logins

-w /var/run/faillock/ -p wa -k logins

 

  1. 记录会话启动事件

-w /var/run/utmp -p wa -k session

-w /var/log/wtmp -p wa -k logins

-w /var/log/btmp -p wa -k logins

文件/var/run/utmp跟踪当前登录的所有用户。所有审计记录都将用标识符“session”标记,  可以用who命令读取

/var/log/wtmp文件跟踪登录、注销、关机和重新启动事件。

文件/var/log/btmp跟踪失败的登录尝试,可以通过输入命令 ‘/usr/bin/last-f  /var/log/btmp’ 读取。所有审核记录都将被标记为标识符“logins”

 

  1. 监视对文件权限、属性、所有权和组的更改

-a always,exit -F arch=b64 -S chmod -S fchmod -S fchmodat -F auid>=1000 -F auid!=4294967295 -k perm_mod

-a always,exit -F arch=b32 -S chmod -S fchmod -S fchmodat -F auid>=1000 -F auid!=4294967295 -k perm_mod

-a always,exit -F arch=b64 -S chown -S fchown -S fchownat -S lchown -F auid>=1000 -F auid!=4294967295 -k perm_mod

-a always,exit -F arch=b32 -S chown -S fchown -S fchownat -S lchown -F auid>=1000 -F auid!=4294967295 -k perm_mod

-a always,exit -F arch=b64 -S setxattr -S lsetxattr -S fsetxattr -S removexattr -S lremovexattr -S fremovexattr -F auid>=1000 -F auid!=4294967295 -k perm_mod

-a always,exit -F arch=b32 -S setxattr -S lsetxattr -S fsetxattr -S removexattr -S lremovexattr -S fremovexattr -F auid>=1000 -F auid!=4294967295 -k perm_mod

在所有情况下,审核记录将只为非系统用户id(auid>=1000)并将忽略守护进程事件(auid=4294967295)。

所有审计记录用标识符“perm_mod”标记

 

  1. 记录未授权文件访问尝试

-a always,exit -F arch=b64 -S creat -S open -S openat -S truncate -S ftruncate -F exit=-EACCES -F auid>=1000 -F auid!=4294967295 -k access

-a always,exit -F arch=b32 -S creat -S open -S openat -S truncate -S ftruncate -F exit=-EACCES -F auid>=1000 -F auid!=4294967295 -k access

-a always,exit -F arch=b64 -S creat -S open -S openat -S truncate -S ftruncate -F exit=-EPERM -F auid>=1000 -F auid!=4294967295 -k access

-a always,exit -F arch=b32 -S creat -S open -S openat -S truncate -S ftruncate -F exit=-EPERM -F auid>=1000 -F auid!=4294967295 -k access

 

  1. 确保收集使用特权命令

监视特权程序(那些在执行时设置了setuid和/或setgid位的程序)以确定没有权限的用户是否正在运行这些命令。

通过下面命令

 find / -xdev \( -perm -4000 -o -perm -2000 \) -type f | awk

'{print \

"-a always,exit -F path=" $1 " -F perm=x -F auid>=1000 -F auid!=4294967295 \

-k privileged" }'

得到记录

-a always,exit -F path=/usr/bin/chfn -F perm=x -F auid>=1000 -F auid!=4294967295  -k privileged

-a always,exit -F path=/usr/bin/chsh -F perm=x -F auid>=1000 -F auid!=4294967295  -k privileged

-a always,exit -F path=/usr/bin/chage -F perm=x -F auid>=1000 -F auid!=4294967295  -k privileged

-a always,exit -F path=/usr/bin/gpasswd -F perm=x -F auid>=1000 -F auid!=4294967295  -k privileged

-a always,exit -F path=/usr/bin/newgrp -F perm=x -F auid>=1000 -F auid!=4294967295  -k privileged

-a always,exit -F path=/usr/bin/mount -F perm=x -F auid>=1000 -F auid!=4294967295  -k privileged

-a always,exit -F path=/usr/bin/su -F perm=x -F auid>=1000 -F auid!=4294967295  -k privileged

-a always,exit -F path=/usr/bin/umount -F perm=x -F auid>=1000 -F auid!=4294967295  -k privileged

-a always,exit -F path=/usr/bin/sudo -F perm=x -F auid>=1000 -F auid!=4294967295  -k privileged

-a always,exit -F path=/usr/bin/write -F perm=x -F auid>=1000 -F auid!=4294967295  -k privileged

-a always,exit -F path=/usr/bin/crontab -F perm=x -F auid>=1000 -F auid!=4294967295  -k privileged

-a always,exit -F path=/usr/bin/ssh-agent -F perm=x -F auid>=1000 -F auid!=4294967295  -k privileged

-a always,exit -F path=/usr/bin/pkexec -F perm=x -F auid>=1000 -F auid!=4294967295  -k privileged

-a always,exit -F path=/usr/bin/passwd -F perm=x -F auid>=1000 -F auid!=4294967295  -k privileged

-a always,exit -F path=/usr/sbin/unix_chkpwd -F perm=x -F auid>=1000 -F auid!=4294967295  -k privileged

-a always,exit -F path=/usr/sbin/pam_timestamp_check -F perm=x -F auid>=1000 -F auid!=4294967295  -k privileged

-a always,exit -F path=/usr/sbin/netreport -F perm=x -F auid>=1000 -F auid!=4294967295  -k privileged

-a always,exit -F path=/usr/sbin/usernetctl -F perm=x -F auid>=1000 -F auid!=4294967295  -k privileged

-a always,exit -F path=/usr/sbin/postdrop -F perm=x -F auid>=1000 -F auid!=4294967295  -k privileged

-a always,exit -F path=/usr/sbin/postqueue -F perm=x -F auid>=1000 -F auid!=4294967295  -k privileged

-a always,exit -F path=/usr/lib/polkit-1/polkit-agent-helper-1 -F perm=x -F auid>=1000 -F auid!=4294967295  -k privileged

-a always,exit -F path=/usr/libexec/utempter/utempter -F perm=x -F auid>=1000 -F auid!=4294967295  -k privileged

-a always,exit -F path=/usr/libexec/dbus-1/dbus-daemon-launch-helper -F perm=x -F auid>=1000 -F auid!=4294967295  -k privileged

-a always,exit -F path=/usr/libexec/openssh/ssh-keysign -F perm=x -F auid>=1000 -F auid!=4294967295  -k privileged

 

  1. 收集成功挂载磁盘事件

-a always,exit -F arch=b64 -S mount -F auid>=1000 -F auid!=4294967295 -k mounts

-a always,exit -F arch=b32 -S mount -F auid>=1000 -F auid!=4294967295 -k mount

 

  1. 确保收集用户的文件删除事件

-a always,exit -F arch=b64 -S unlink -S unlinkat -S rename -S renameat -F auid>=1000 -F auid!=4294967295 -k delete

-a always,exit -F arch=b32 -S unlink -S unlinkat -S rename -S renameat -F auid>=1000 -F auid!=4294967295 -k delete

 

  1. 确保收集对系统管理范围(sudoers)的更改

-w /etc/sudoers -p wa -k scope

-w /etc/sudoers.d/ -p wa -k scope

 

  1. 监视sudo日志文件

如果系统已正确配置为禁用su命令并强制所有管理员必须先登录,然后使用sudo执行特权命令,

然后所有管理员命令将被记录到/var/log/sudo.log文件.

每当执行命令时,审核事件将被触发为/var/log/sudo.log文件将打开文件进行写入,并执行管理命令将写入日志。

-w /var/log/sudo.log -p wa -k actions

 

  1. 确保收集内核模块加载和卸载

-w /sbin/insmod -p x -k modules

-w /sbin/rmmod -p x -k modules

-w /sbin/modprobe -p x -k modules

-a always,exit -F arch=b64 -S init_module -S delete_module -k modules

 

  1. 确保审核配置是不可变的

审核规则不能使用auditctl修改。设置标志“-e2“强制将审核置于不可变模式。进行审核更改只能对系统重新启动。

-e 2

5、日志轮转logrotate

/etc/logrotate.conf (决定每个日志文件如何轮转)

/etc/logrotate.d/* (子配置文件 自定义 方便管理)

/etc/logrotate.conf:

# 通用配置

weekly # 按周轮转

rotate 4 # 保留4份日志文件

create # 轮转后创建新文件

dateext # 使用日期作为后缀

#compress # 是否压缩

include /etc/logrotate.d # 包含该目录下的子配置文件 启动轮转时 也去该目录读一下配置文件

# 专有配置

/var/log/wtmp { # 对某日志文件设置轮转的方法

    monthly # 每月一次

    create 0664 root utmp # 轮转后创建新文件,并设置权限

    minsize 1M # 最小达到1M才轮转 monthly and minsize

    rotate 1 # 保留一份

}

/var/log/btmp {

    missingok # 丢失不提示

    monthly

    create 0600 root utmp

    rotate 1

}

日志轮转的命令:

/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf

20、文件权限管理的核查

一般等保的文件权限管理要求,特别是针对审计上的要求

/etc/passwd  644

/etc/shadow  000

/etc/log/*  600、644,且基本上都属于root:root

/etc/log/audit 600 root:root

1、关于S位的设定

. 前提 

本篇主要讲解SUID, SGID, Sticky三个权限的基本原理和应用.

为什么要使用特殊权限?

比如系统中假如有超过四类人然而每一类人都需要一种独特权限.只有三种独特权限的基础权限系统就会明显不够用.

特殊权限可以扩展系统基础权限的功能,使得linux权限更加强大灵活.

在理解特殊权限之前,需要先具备几个关于安全上下文的认知:

前提:进程有属主和属组;文件有属主和属组;

(1) 任何一个可执行程序文件能不能启动为进程:取决于发起者对程序文件是否拥有执行权限;

(2) 启动为进程之后,其进程的属主为发起者;进程的属组为发起者所属的组;

(3) 进程访问文件时的权限,取决于进程的发起者:

(a) 进程的发起者,同文件的属主:则应用文件属主权限;

(b) 进程的发起者,属于文件的属组;则应用文件属组权限;

(c) 应用文件“其它”权限; 

. SUID 

  1. 权限设定方法:

字母表示法:

chmod u+s FILE...

chmod u-s FILE...

数字表示法:

chmod 4755 FILE 添加SUID权限到二进制程序文件(添加到DIR无意义)

在普通三位数字权限位之前,用4代表添加的SUID位

chmod 0xxx .... 可以删除文件的SUID(无法删除目录的SUID)  

  1. 文件权限表示:

# ll f1

-rwsr-xr-x. 1 root root 0 Nov 17 20:18 f1

文件属主的x权限,用s代替.表示被设置了SUID

如果属主位没有x权限,会显示为大写S,表示有故障(权限无效) 

  1. SUID相关说明:

启动为进程之后,其进程的属主为原程序文件的属主;

只能作用在二进制程序上,不能作用在脚本上,且设置在目录上无意义 ;

执行suid权限的程序时,此用户将继承此程序的所有者权限;  

  1. SUID工作原理

环境前提:

linux中有一个二进制程序cat,属主属组均为root

linux中有一个系统文件/etc/shadow,属主属组均为root

我们创建一个普通用户叫user1

user1具有对cat的执行权限(可以拷贝道home目录下,但还是root:root)

user1 不具有对/etc/shadow的任何权限

默认情况下

user1执行cat,系统创建一个cat进程,进程的属主属组取程序发起者,也就是user1:user1

cat进程访问/etc/shadow,由于进程属主属组是user1:user1,与/etc/shadow的属组属主都不匹配,所以被拒绝访问.

给cat设置SUID之后

user1执行cat.系统创建一个cat进程,进程的属主取cat的属主,属组取程序发起者,就是root:user1

cat进程访问/etc/shadow,由于进程属主是root,与/etc/shadow的属主匹配,所以被允许访问.  

  1. 举例说明:

passwd命令是linux系统中用来修改密码的命令.系统中所有用户都可以使用.

而passwd命令改密码的行为是通过修改/etc/shadow文件来实现.

看一下/etc/shadow的文件权限:

# ll /etc/shadow

----------. 1 root root 1771 Nov 16 17:06 /etc/shadow 

可见/etc/shadow对普通用户没有任何权限.

所以普通用户默认无法使用文本编辑器打开或者编辑这个文件.

那为什么通过passwd这个命令就可以编辑呢?

用ls命令查看passwd命令的源文件信息:

# ls -l /usr/bin/passwd

-rwsr-xr-x. 1 root root 30768 2月  22 2012 /usr/bin/passwd 

我们发现passwd这个程序的属主位的执行位不是x而是s,说明passwd被设置了特殊权限SUID.

于是普通用户运行passwd命令,系统创建的passwd进程的属主由默认为"程序发起者"变为了passwd的属主

而passwd的属主是root,所以普通用户其实是在用root的权限修改/etc/shadow文件.最后passwd命令执行结束,passwd进程被关闭. 

  1. 做个实验:

给命令vim添加SUID,可以让普通用户自己把自己变为超级用户.

看一下vim的原权限

#ll /usr/bin/vim

-rwxr-xr-x. 1 root root 2289640 Aug  2 08:45 /usr/bin/vim 

给vim加个SUID

# chmod u+s /usr/bin/vim 

权限变为

-rwsr-xr-x. 1 root root 2289640 Aug  2 08:45 /usr/bin/vim

现在用普通用户登录

# su quintin 

尝试使用vim编辑系统账户文件/etc/passwd

$ vim /etc/passwd 

找到自己的用户名一行

  

修改第三列自己的uid为0

root的uid不用改.

然后保存,提示只读文件,使用w!强制保存,成功!

   

我们知道普通用户quintin对vim是有执行权限的,而对/etc/passwd则没有编辑权限.

通常情况下quintin启动vim后,系统会创建一个以当前用户quintin为属主属组的vim进程,

此时vim进程的属主属组为quintin:quintin,由于无论是属主还是属组都不具有对/etc/passwd的编辑权限,

所以这个vim进程无权编辑/etc/passwd.

而给/usr/bin/vim设置了SUID之后,quintin或任何用户启动vim程序时,

系统创建的vim进程的属主则是取了/usr/bin/vim这个程序文件自身的属主root,

所以此时vim进程的属主属组为root:quintin. 系统检查发现正好匹配了/etc/passwd的属主,于是放行vim进程.

其他文本编辑器同理.

退出vim并重新登陆quintin帐户

这时发现命令提示符已完全变为root,而且系统认为我就是root

 因为linux只通过uid判断超级管理员,而quintin帐户把自己的uid变成了超级管理员一样的0,

所以重新登陆之后,quintin具有了root的身份.

测试:

找一个属主属组都为root且other位无w的文件

# ll /app/f11

-rw-r--r--.  1 root root   0 Nov 17 20:18 f11 

改个名字

# mv f11 f1 

 成功.

.  SGID 

  1. 权限设定方法:

字母表示法

chmod g+s DIR/FILE...

chmod g-s DIR/FILE...

数字表示法 :

chmod 2755  DIR/FILE 添加SGID到目录或文件

在普通数字权限位前,用2代表添加SGID位

chmod 0755 DIR/FILE 删除文件的SGID,(目录不受影响)

chmod 755 DIR/FILE 同上 

  1. 文件权限表示:

# ll /app/f1

-rwxr-sr-x. 1 root root 0 Nov 17 20:18 /app/f1 

文件属组的x权限,用s代替.表示被设置了SGID

如果属组位没有x权限,会显示为大写S,表示有故障(权限无效) 

  1. SGID相关说明:

作用在二进制程序上时:

执行sgid权限的程序时,此用户将继承此程序的所属组权限

作用于目录上时:

此文件夹下所有用户新建文件都自动继承此目录的用户组. 

  1. SGID实例:

作用在二进制程序上时,原理同SUID,只是由user位变为group位.

作用于目录上时演示:

普通帐户quintin在/tmp中创建一个目录叫quintindir,添加SGID.权限777

$ chmod 2777 quintindir/

$ ll -d quintindir/

drwxrwsrwx. 2 quintin quintin 6 Nov 18 14:42 quintindir/ 

切换到普通用户user1,在quintindir目录中创建一个文件和一个目录

$ touch user1file

$ mkdir user1dir

$ ll

-rw-rw-r--. 1 user1 quintin 0 Nov 18 14:47 user1file

drwxrwsr-x. 2 user1 quintin 6 Nov 18 14:47 user1dir 

结果显示,user1在quintindir目录下创建的文件和目录都自动继承了quintindir的属组

而且新目录的权限也继承了SGID.

所以设定了SGID的目录中的所有新建文件和目录都会自动属于quintin组.

. Sticky粘滞位 

  1. 权限设定方法:

字母表示法:

chmod o+t DIR...

chmod o-t DIR...

chmod +t DIR...

数字表示法:

chmod 1755 DIR

在普通数字权限位前,用1代表添加Sticky位 

  1. 文件权限表示:

       

# ll -d tmp

        drwxrwxrwt. 2 root root 19 Nov 17 20:02 tmp 

        文件other位的x权限,用t代替.表示被设置了Sticky

        如果other位没有x权限,会显示为大写T,表示有故障(权限无效) 

  1. Sticky相关说明:

对于一个多人可写的目录,如果设置了sticky,则每个用户仅能删除和改名自己的文件或目录

只能作用在目录上.普通文件设置无意义,且会被linux内核忽略

用户在设置Sticky权限的目录下新建的目录不会自动继承Sticky权限 

  1. Sticky实例

目的:

我希望在系统中创建一个很多用户可以共同使用的目录,但是要求用户之间不能互相删除改变对方的文件. 

实现:

root用户先创建一个777权限目录/app/tmp

普通用户quintin和wang分别在其中创建几个文件和目录

这时候有个问题,就是目录中的任何用户都可以随意删除其他人的文件.

所以root要给/tmp这个文件夹设定一个Sticky位.

# chmod 1777 tmp

# ll -d tmp

drwxrwxrwt. 5 root root 97 Nov 20 00:49 tmp 

设定完毕可见目录tmp的other权限中的x位已经显示为t.说明已设定成功. 

测试

切换到quintin用户,进入/app/tmp目录

尝试删除或改名用户wang的文件或目录

改名文件

[quintin@centos7 /app/tmp]$ mv wangf1 aaa

mv: cannot move ‘wangf1’ to ‘aaa’: Operation not permitted 

改名目录

[quintin@centos7 /app/tmp]$ mv wangd1 bbb

mv: cannot move ‘wangd1’ to ‘bbb’: Operation not permitted 

移动文件

[quintin@centos7 /app/tmp]$ mv wangf1 qdir1/

mv: cannot move ‘wangf1’ to ‘qdir1/wangf1’: Operation not permitted 

删除文件

[quintin@centos7 /app/tmp]$ rm -f wangf1

rm: cannot remove ‘wangf1’: Operation not permitted 

删除目录

[quintin@centos7 /app/tmp]$ rm -f wangf1

rm: cannot remove ‘wangf1’: Operation not permitted 

以上所有操作均提示Operation not permitted,表明Sticky权限已发挥作用.

提示:

普通用户在设定了Sticky位的目录下创建的子目录不会继承这个Sticky权限,所以要注意设定好自己目录的权限. 

. 总结

  1. 作用范围及功能:

SUID:作用于文件(二进制程序)

此用户将继承此程序的所有者权限

SGID:作用于文件(二进制程序)和目录

对于文件:

此用户将继承此程序的所属组权限.

对于目录:

此文件夹下所有用户新建文件都自动继承此目录的用户组.

Sticky:作用于目录

设定后,目录中的用户只能删除、移动或改名自己的文件或目录

二进制文件

目录

SUID

此用户将继承此程序的所有者权限

无意义

SGID

此用户将继承此程序的所属组权限

此目录下所有用户新建文件都自动继承此目录的用户组

Sticky

无意义

目录中每个用户仅能删除、移动或改名自己的文件或目录

  • 35
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值