一、合理使用Shell历史命令记录功能

在Linux下可通过history命令查看用户所有的历史操作记录,同时shell命令操作记录默认保存在用户目录下 的.bash_history文件中,通过这个文件可以查询shell命令的执行历史,有助于运维人员进行系统审计和问题排查,同时,在服务器遭受黑客攻 击后,也可以通过这个命令或文件查询黑客登录服务器所执行的历史命令操作,但是有时候黑客在入侵服务器后为了毁灭痕迹,可能会删 除.bash_history文件,这就需要合理的保护或备份.bash_history文件。下面介绍下history日志文件的安全配置方法。

默认的history命令只能查看用户历史操作记录,并不能区分每个用户操作命令的时间,这点对于排查问题十分不便,不过可以通过下面的方法(加入四行内容)让history命令自动记录所有shell命令的执行时间,编辑/etc/bashrc文件:

  1. HISTFILESIZE=4000
  2. HISTSIZE=4000
  3. HISTTIMEFORMAT='%F %T'
  4. export HISTTIMEFORMAT

其中,HISTFILESIZE定义了在.bash_history文件中保存命令的记录总数,默认值是1000,这里设置为 4000;HISTSIZE定义了history命令输出的记录总数;HISTTIMEFORMAT定义时间显示格式,这里的格式与date命令后的 “+"%F %T"”是一致的;HISTTIMEFORMAT作为history的时间变量将值传递给history命令。

通过这样的设置后,执行history命令,就会显示每个历史命令的详细执行时间,例如:

  1. [root@server ~]# history
  2. 247  2013-10-05 17:16:28 vi /etc/bashrc
  3. 248  2013-10-05 17:16:28 top
  4. 249  2013-10-05 17:04:18 vmstat
  5. 250  2013-10-05 17:04:24 ps -ef
  6. 251  2013-10-05 17:16:29 ls -al
  7. 252  2013-10-05 17:16:32 lsattr
  8. 253  2013-10-05 17:17:16 vi /etc/profile
  9. 254  2013-10-05 17:19:32 date +"%F %T"
  10. 255  2013-10-05 17:21:06 lsof
  11. 256  2013-10-05 17:21:21 history

为了确保服务器的安全,保留shell命令的执行历史是非常有用的一条技巧。shell虽然有历史功能,但是这个功能并非针对审计目的而设计,因此 很容易被黑客篡改或是丢失。下面再介绍一种方法,可以实现详细记录登录过系统的用户、IP地址、shell命令以及详细操作时间等,并将这些信息以文件的 形式保存在一个安全的地方,以供系统审计和故障排查。

将下面这段代码添加到/etc/profile文件中,即可实现上述功能。

    1. #history
    2. USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'`
    3. HISTDIR=/usr/share/.history
    4. if [ -z $USER_IP ]
    5. then
    6. USER_IP=`hostname`
    7. fi
    8. if [ ! -d $HISTDIR ]
    9. then
    10. mkdir -p $HISTDIR
    11. chmod 777 $HISTDIR
    12. fi
    13. if [ ! -d $HISTDIR/${LOGNAME} ]
    14. then
    15. mkdir -p $HISTDIR/${LOGNAME}
    16. chmod 300 $HISTDIR/${LOGNAME}
    17. fi
    18. export HISTSIZE=4000
    19. DT=`date +%Y%m%d_%H%M%S`
    20. export HISTFILE="$HISTDIR/${LOGNAME}/${USER_IP}.history.$DT"
    21. export HISTTIMEFORMAT="[%Y.%m.%d %H:%M:%S]"
    22. chmod 600 $HISTDIR/${LOGNAME}/*.history* 2>/dev/null

保存历史命令的文件夹目录要尽量隐蔽,避免被黑客发现后删除。

二、合理使用su、sudo命令

su命令是一个切换用户的工具,经常用于将普通用户切换到超级用户下,当然也可以从超级用户切换到普通用户。为了保证服务器的安全,几乎所有服务器 都禁止了超级用户直接登录系统,而是通过普通用户登录系统,然后再通过su命令切换到超级用户下,执行一些需要超级权限的工作。通过su命令能够给系统管 理带来一定的方便,但是也存在不安全的因素,例如系统有10个普通用户,每个用户都需要执行一些有超级权限的操作,就必须把超级用户的密码交给这10个普 通用户,如果这10个用户都有超级权限,通过超级权限可以做任何事,那么会在一定程度上对系统的安全造成了威协。因此su命令在很多人都需要参与的系统管 理中,并不是最好的选择,超级用户密码应该掌握在少数人手中,此时sudo命令就派上用场了。

sudo命令允许系统管理员分配给普通用户一些合理的“权利”,并且不需要普通用户知道超级用户密码,就能让他们执行一些只有超级用户或其他特许用 户才能完成的任务,比如系统服务重启、编辑系统配置文件等,通过这种方式不但能减少超级用户登录次数和管理时间,也提高了系统安全性。因此,sudo命令 相对于权限无限制性的su来说,还是比较安全的,所以sudo也被称为受限制的su,另外sudo也是需要事先进行授权认证的,所以也被称为授权认证的 su。

sudo执行命令的流程是:将当前用户切换到超级用户下,或切换到指定的用户下,然后以超级用户或其指定切换到的用户身份执行命令,执行完成后,直接退回到当前用户,而这一切的完成要通过sudo的配置文件/etc/sudoers来进行授权。

例如,/etc/shadow文件普通用户是无法访问的:

  1. [user01@unknown ~]$ more /etc/shadow
  2. /etc/shadow: Permission denied

如果要让普通用户user01可访问这个文件,可以在/etc/sudoers添加如下内容:

  1. user01     ALL = /bin/more /etc/shadow
  2. 这样,通过如下方式user01用户就可访问/etc/shadow文件:
  3. [user01@unknown ~]$ sudo more /etc/shadow
  4. [sudo] password for user01:

执行这个命令后,需要输入user01用户的密码,然后就可访问文件内容了。在这里sudo使用时间戳文件来完成类似“检票”的系统,当用户输入密 码后就获得了一张默认存活期为5分钟的“入场券”(默认值可以在编译的时候改变)。超时以后,用户必须重新输入密码才能查看文件内容。

如果每次都需要输入密码,那么某些自动调用超级权限的程序就会出现问题,此时可以通过下面的设置,让普通用户无需输入密码即可执行具有超级权限的程 序。例如,要让普通用户centreon具有/etc/init.d/nagios脚本重启的权限,可以在/etc/sudoers添加如下设置:

  1. CENTREON   ALL = NOPASSWD: /etc/init.d/nagios restart

这样,普通用户centreon就可以执行nagios重启的脚本而无需输入密码了。如果要让一个普通用户user02具有超级用户的所有权限,而又不想输入超级用户的密码,只需在/etc/sudoers添加如下内容即可:

  1. user02 ALL=(ALL) NOPASSWD: ALL

这样user02用户登录系统后,就可以通过执行如下命令切换到超级用户下:

  1. [user02@unknown ~]$ sudo su -
  2. [root@unknown ~]# pwd
  3. /root

sudo设计的宗旨是:赋予用户尽可能少的权限但仍允许它们完成自己的工作,这种设计兼顾了安全性和易用性,因此,强烈推荐通过sudo来管理系统 账号的安全,只允许普通用户登录系统,如果这些用户需要特殊的权限,就通过配置/etc/sudoers来完成,这也是多用户系统下账号安全管理的基本方 式。

三、删减系统登录欢迎信息

系统的一些欢迎信息或版本信息,虽然能给系统管理者带来一定的方便,但是这些信息有时候可能被黑客利用,成为攻击服务器的帮凶,为了保证系统的安 全,可以修改或删除某些系统文件,需要修改或删除的文件有4个,分别是/etc/issue、/etc/issue.net、/etc/redhat- release和/etc/motd。

/etc/issue和/etc/issue.net文件都记录了操作系统的名称和版本号,当用户通过本地终端或本地虚拟控制台等登录系统时, /etc/issue的文件内容就会显示,当用户通过ssh或telnet等远程登录系统时,/etc/issue.net文件内容就会在登录后显示。在 默认情况下/etc/issue.net文件的内容是不会在ssh登录后显示的,要显示这个信息可以修改/etc/ssh/sshd_config文件, 在此文件中添加如下内容即可:

  1. Banner /etc/issue.net

其实这些登录提示很明显泄漏了系统信息,为了安全起见,建议将此文件中的内容删除或修改。

/etc/redhat-release文件也记录了操作系统的名称和版本号,为了安全起见,可以将此文件中的内容删除。

/etc/motd文件是系统的公告信息。每次用户登录后,/etc/motd文件的内容就会显示在用户的终端。通过这个文件系统管理员可以发布一 些软件或硬件的升级、系统维护等通告信息,但是此文件的最大作用就、是可以发布一些警告信息,当黑客登录系统后,会发现这些警告信息,进而产生一些震慑作 用。看过国外的一个报道,黑客入侵了一个服务器,而这个服务器却给出了欢迎登录的信息,因此法院不做任何裁决。

安全运维之:Linux系统账户和登录安全的更多相关文章

  1. 运维 07 Linux系统基础优化及常用命令

    Linux系统基础优化及常用命令   Linux基础系统优化 引言没有,只有一张图. Linux的网络功能相当强悍,一时之间我们无法了解所有的网络命令,在配置服务器基础环境时,先了解下网络参数设定命令 ...

  2. 【Linux 运维】linux系统关机、重启、注销命令

    linux 关机.重启.注销命令: 关机命令: shutdown -h now 立刻关机(生产常用) shutdown -h  +1  一分钟后关机      (    shutdown -c 可以将 ...

  3. 【Linux 运维】linux系统查看版本信息

    查看linux系统版本信息: [root@kvm-host~]# cat /proc/version       (Linux查看当前操作系统版本信息)Linux version 3.10.0-514 ...

  4. 安全运维之:Linux系统账户和登录安全(转)

    三.删减系统登录欢迎信息 系统的一些欢迎信息或版本信息,虽然能给系统管理者带来一定的方便,但是这些信息有时候可能被黑客利用,成为攻击服务器的帮凶,为了保证系统的安全,可以修改或删除某些系统文件,需要修 ...

  5. 【Linux 运维】linux系统修改主机名

    主机名的修改:  1.命名解释: [root@localhost~]# 分别代表: 用户名(root) 主机名(localhost) 当前路径(~,当前用户的home目录) 权限标志位(#代表root ...

  6. 【linux运维】linux系统上忘记密码如何操作

    目录 红帽系统忘记密码操作 红帽系统设置ip,主机名 centos系统忘记密码操作 一.红帽系统忘记密码操作 1)再出现以下界面后按键盘e键 2)进入以下界面后,再次按e键 3)使用上下键选择第2项或 ...

  7. 【Linux 运维】Linux 目录

    目录 [Linux 运维]Centos7初始化网络配置 [Linux 运维]linux系统修改主机名 [Linux 运维]linux系统关机.重启.注销命令 [Linux 运维]linux系统查看版本 ...

  8. 运维之linux基础知识(一)

    运维之linux基础知识(一) 1.GUI:Graphic User Interface 图形用户界面 2.CLI:Command line Interface 命令行界面 3 dll:Dynamic ...

  9. 运维自动化之系统部署 PXE(二)

    PXE介绍 Preboot Excution Environment 预启动执行环境 Intel公司研发 基于Client/Server的网络模式,支持远程主机通过网络从远端服务器下载映像,并由此支持 ...

随机推荐

  1. 关于UIButton中的ContentEdgeInsets的深入研究

    UIButton的contentEdgeInsets属性的深入研究 由于用UIButton这个属性做过一些东西,但是对它的规律始终不太了解,虽然苹果官方文档的解释大体上可以理解为,这个属性设置的是内边 ...

  2. The 4th tip of DB Query Analyzer

    The 4th tip of DB QueryAnalyzer Ma Genfeng (Guangdong Unitoll Services incorporated, Guangzhou 51030 ...

  3. python爬爬(网友提供学习)

    import urllib2,urllib,os,re def ZZ(url): pathw=os.getcwd() #图片和标题目录 imagetitleregion=r'<div class ...

  4. [R语言画图]气泡图symbols

    绘制气泡图主要使用函数symbols(x,y,circle=r).当中x.y是坐标轴,r是每一个点的半径. x<-rnorm(10) y<-rnorm(10) r<-abs(rnor ...

  5. UIProgressView-初识IOS

    好几天没更新了,学的时候太紧,没时间复习了都.今天刚好有时间,多更几个. 今天复习的是UIProgressView,我们常见使用在修改某些属性的时候经常用到,比如透明度,今天我们介绍一个简单的使用例子 ...

  6. [core Java学习笔记][第一二三章基本语法]

    基本语法 1 Java 简单的类型 1.1 一些常量 正无穷大 Double.POSITVE_INFINITY 负无穷大 Double.NEGATIVE_INFINITY 不存在 Double.NaN ...

  7. border-radius实例1

    简单参数设置一 1.html <div class="paddingBig"> <div class="divSmall radiusOne" ...

  8. CGFloat和float

    CGFloat :在mac上自适应,在64位的系统,会变宽,32位会变窄,手机没变化float:没有变化

  9. struts2中的国际化

    [java] view plaincopy 实现struts2中国际化其实非常简单 首先,struts2中的国际化是通过资源文件来配置的. 资源文件分为:action类级,package类级,还有we ...

  10. C++程序设计实践指导1.1删除序列中相同的数改写要求实现

    改写要求1:改写为以指针为数据结构 #include <iostream> #include <cstdlib> using namespace std; class ARP ...