企业系统的基础优化和awk命令取倒数的列

cat > name.txt << EOF
马纤羽 深圳 173 50 xxxxxxxxxxxxx
乔亦菲 广州 172 52 xxxxxxxxxxxxx
罗梦竹 北京 175 49 xxxxxxxxxxxxx
刘诺涵 北京 170 48 xxxxxxxxxxxxx
岳妮妮 深圳 177 54 xxxxxxxxxxxxx
贺婉萱 深圳 174 52 xxxxxxxxxxxxx
叶梓萱 上海 171 49 xxxxxxxxxxxxx
EOF

用awk获取文件中第三行打的倒数第二列字段

awk 'NR==3{print $(NF-1)}' name.txt

 

企业系统的基础优化:

1.建立普通用户。

2.关闭SELinux。

3.关闭iptables(内网和高并发流量的业务服务器必要关闭)。

4.统一字符集。

5.调整yum源 (使用aliyun镜像做yum源)。

默认国外的yum源(软件仓库)比较慢,所以换成国内的。

6.设定运行级别为3(文本模式)

7.linux特殊变量--调整历史纪录和终端超时。

8.隐藏Linux版本信息显示

9.精简开机系统启动

10.利用sudo控制用户对系统命令的使用权限

11.Linux系统安全最小化原则说明

12.更改SSH服务端远程登陆的配置

13.设置Linux服务器时间同步

14.历史记录数及登陆超时环境变量设置

15.调整linux系统文件描述符数量

16.Linux服务器内核参数优化

17.定时清理邮件服务临时目录垃圾文件

18.锁定关键系统文件,防止提权被篡改

19.清楚多余的系统虚拟账号

20.为grub菜单加密码

21.禁止Linux系统被ping

22.升级具有典型漏洞的软件版本

小结

  1. 不用root登录管理系统,而以普通用户登录通过sudo授权管理。
  2. 更改默认的远程连接SSH服务端口,禁止root用户远程连接,甚至要更改SSH服务只监听内网IP。
  3. 定时自动更新服务器的时间,使其和互联网时间同步。
  4. 配置yum更新源,从国内更新源下载安装软件包。
  5. 关闭SELinux及iptables(在工作场景中,如果有外部IP一般要打开iptables,高并发高流量的服务器可能无法开启)。
  6. 调整文件描述符的数量,进程及文件的打开都会消耗文件描述符数量。
  7. 定时自动清理邮件临时目录垃圾文件,防止磁盘的inodes数被小文件占满(注意Centos6和Centos5要清除的目录不同)。
  8. 精简并保留必要的开机自启动服务(如crond、sshd、network、rsyslog、sysstat)。
  9. Linux内核参数优化/etc/sysctl.conf,执行sysctl -p生效。
  10. 更改系统字符集为“zh_CN.UTF-8”,使其支持中文,防止出现乱码问题。
  11. 锁定关键系统文件如/etc/passwd、/etc/shadow、/etc/group、/etc/gshadow、/etc/inittab,处理以上内容后把chattr、lsattr改名为luffy,转移走,这样就安全多了。
  12. 清空/etc/issue、/etc/issue.net,去除系统及内核版本登录前的屏幕显示。
  13. 清除多余的系统虚拟用户账号。
  14. 为grub引导菜单加密码。
  15. 禁止主机被ping。
  16. 打补丁并升级有已知漏洞的软件。 新系统 yum –y install 已经在线上用的服务器 web服务器能够停止

正文:

一、系统基础优化

01 添加普通用户账号

linux/unix是一个多用户、多任务的操作系统。
超级管理员(root): root默认在unix/linux操作系统中拥有最高的管理权限。比喻:皇帝
普通用户:管理员或者具备管理权限的用户创建的。权限:系统管理仅可以读、看,不能增、删、改。
权限越大,责任越大。
可使用如下命令添加一个普通用户账号,并为其设置口令:

  [root@LuffyCity ~]# useradd luffy
  [root@LuffyCity ~]# passwd luffy    ###问你新的密码,然后你输入  交互设置密码
  Changing password for user luffy.
  New password:
  BAD PASSWORD: it is too simplistic/systematic #提示密码太简单了,但可以不理会。
  BAD PASSWORD: is too simple
  Retype new password:
  passwd: all authentication tokens updated successfully.

提示:

  • 一般情况下,在企业生产环境中应尽量避免直接到root用户下操作,除非有超越普通用户权限的系统维护需求,使用完后立刻退回到普通用户。
  • 非交互式设置密码:还可通过下面的命令一步到位地设置密码(其中,luffy为用户名,密码为123456)。

    echo "123456"|passwd --stdin luffy && history -c
    

尝试切换用户角色,命令如下:

  [root@LuffyCity ~]# su - luffy   <==由root管理员,切换到普通用户luffy
  [luffy@LuffyCity ~]$ whoami       <==查看当前用户是什么
  luffy
  [luffy@LuffyCity ~]$ su - root   <==切回到root用户
  Password:

说明:
1)超级用户root切换到普通用户下面,无需输入对应用户密码,这相当于“皇帝”去“大臣”家里。
2)普通用户切换到root或其他普通用户下,需要输入切换的对应用户密码。
3)普通用户的权限比较小,只能进行基本的系统信息查看等操作,无法更改系统配置和管理服务。
4)$符号是普通用户的命令行提示符,#符号是超级管理员的提示符。示例如下:

  [luffy@LuffyCity ~]$  #普通用户luffy对应的提示符
  [root@LuffyCity ~]#    #超级管理员root对应的提示符

5)提示符@前面的字符代表当前用户(可用whoami查询),后面的为主机名(可用hostname查询),~所在的位置是窗口当前用户所在的路径。示例如下:

  [luffy@LuffyCity ~]$ #luffy为当前用户,LuffyCity为主机名,~表示当前目录,即家目录。

6)Linux命令提示符由PS1环境变量控制。示例如下:

  [root@LuffyCity ~]# echo $PS1
  [\u@\h \W]\$

这里的PS1='[\u@\h \W]$ ',可以通过全局变量配置/etc/profile文件调整PS1='[\u@\h \W\t]$ '。
注意:PS1必须大写的。

参数含义
\d代表日期,格式为weekday month date。
\H完整的主机名称。
\h仅取主机的第一个名字。
\t显示时间为24小时格式,如HHMMSS。
\T显示时间为12小时格式。
\A显示时间为24小时格式HHMM。
\u当前用户的账号名称。
\vBASH的版本信息。
\w完整的工作目录名称。家目录会以~显示
\W利用basename取得工作目录名称,所以只会列出最后一个目录
\#下达的第几个命令
\$提示字符,如果是root时,提示符为# ,普通用户则为$

变量(放东西 查看变量的内容 ) PS1---变量的名字------藏经阁里面的武功秘籍(葵花宝典) 秘籍名字(书名) $PS1---查看变量里面的内容---手端着书(葵花宝典) 看书的内容(读书) PS1=新的内容 ---向变量里面放入东西----修改书的内容(升级书) 欲练此功,必先自宫,若不自宫,也能成功。 linux变量名字(书名)大写的一般是自己用(linux环境变量),在哪里都可以用的变量

02 关闭SELinux

SELinux(Security-Enhanced Linux)是美国国家安全局(NSA)对于强制访问控制的实现,这个功能让系统管理员又爱又恨,这里我们还是把它给关闭了吧,至于安全问题,后面通过其他手段来解决,这也是大多数生产环境的做法,如果非要开启也是可以的。关闭方式如下。

永久关闭selinux

  # 备份
  cp /etc/selinux/config /etc/selinux/config.bak
  # sed修改,看看结果,不加-i
  sed 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
  # 确认并使用 sed -i 修改文件内容
  sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
  # 检查结果
  grep "disabled" /etc/selinux/config

临时关闭selinux

  setenforce 0
  # 数字0表示Permissive,即给出警告提示,但不会阻止操作,相当于disabled。
  # 数字1表示Enforcing,即表示SElinux为开启状态。
  getenforce  # 查看命令

命令说明:

  • setenforce:用于命令行管理SELinux的级别,后面的数字表示设置对应的级别。
  • getenforce:查看SELinux当前的级别状态。

提示:修改配置SElinux后,要想使其生效,必须要重启系统。因此,可配合使用setenforce 0这个临时使其关闭的命令,这样在重启前后都可以使得SElinux关闭生效了,也就是说无须立刻重启服务器了,在生产场景下Linux机器是不能随意重启的(不要给自己找任何理由重启)。

03 关闭iptables防火墙

关闭防火墙的目的是为了让初学者学习更方便,将来在学了iptables技术后可再统一开启。 在企业环境中,一般只有配置外网IP的linux服务器才需要开启防火墙,但即使是有外网IP,对于高并发高流量的业务服务器仍是不能开的,因为会有较大性能损失,导致网站访问很慢,这种情况下只能在前端加更好的硬件防火墙了。 关闭防火墙的具体操作过程如下:

  临时关闭
  [root@LuffyCity ~]# /etc/init.d/iptables stop
  iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
  iptables: Flushing firewall rules:                         [  OK  ]
  iptables: Unloading modules:                               [  OK  ]
  [root@LuffyCity ~]# /etc/init.d/iptables stop   #<==重复执行下确认已关闭。
  [root@LuffyCity ~]# /etc/init.d/iptables status ###查看是否关闭
  iptables: Firewall is not running.
  [root@LuffyCity ~]# chkconfig iptables off      #<==关闭开机自启动命令,前面已经关闭这里就无需执行。
  [root@LuffyCity ~]# chkconfig --list|grep ipt
  iptables        0:off   1:off   2:off   3:off   4:off   5:off   6:off

彻底的让一个服务,不再运行

  • 关闭当前正在运行的进程(服务)=====>/etc/init.d/iptables stop
  • 让他在开机不启动======>chkconfig iptables off
04 如何防止显示中文乱码(该优化初期建议不优化,直接强制看英文)

此项优化为可选项,即调整Linux系统的字符集设置,那么,什么是字符集呢?
简单的说,字符集就是一套文字符号及其编码。目前Linux下常用的字符集有:

  • GBK:定长,双字节,不是国际标准,支持的系统不少,实际企业用的不多。
  • UTF-8:非定长,1~4字节,广泛支持,MYSQL也使用UTF-8,企业广泛使用。 可通过快捷的命令方式在/etc/sysconfig/i18n中添加如下内容,使其支持中文显示:

    [root@LuffyCity ~]# echo $LANG                ###查看系统当前的字符集
    en_US.UTF-8
    [root@LuffyCity ~]# cat /etc/sysconfig/i18n   #####系统字符集配置文件的位置
    LANG="en_US.UTF-8"
    SYSFONT="latarcyrheb-sun16"
    [root@LuffyCity ~]# cp /etc/sysconfig/i18n /etc/sysconfig/i18n.ori  ####备份
    [root@LuffyCity ~]# echo 'LANG="zh_CN.UTF-8"'  >/etc/sysconfig/i18n ####修改配置文件
    #→相当于用vi /etc/sysconfig/i18n 添加LANG="zh_CN.UTF-8"内容
    [root@LuffyCity ~]# source /etc/sysconfig/i18n #→使上文修改生效    ###让配置文件生效
    [root@LuffyCity ~]# echo $LANG                                        ###查看系统当前的字符集
    zh_CN.UTF-8
    

    提示:
    乱码的核心解决方法:

  • 系统字符集(utf-8)

  • xshell软件的字符集保持一致(utf-8)
  • 文件使用的字符集一致

    zh_CN.GBK

  • 注意“zh_CN.UTF-8”的大小写字母。
  • 这个中文显示配置要跟你自己的SSH客户端的配置一致。
05 使用aliyun镜像做yum源

默认国外的yum源(软件仓库)比较慢,所以换成国内的。

  1、备份
  mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
  2、下载新的CentOS-Base.repo 到/etc/yum.repos.d/
  CentOS 5
  wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-5.repo
  或者
  curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-5.repo
  CentOS 6
  wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
  或者
  curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
  CentOS 7
  wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
  或者
  curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
  3、之后运行yum makecache生成缓存,此步骤可以不执行。

epel源的安装

  ##epel 配置方法
  ###1、备份(如有配置其他epel源)
  mv /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.backup
  mv /etc/yum.repos.d/epel-testing.repo /etc/yum.repos.d/epel-testing.repo.backup
  2、下载新repo 到/etc/yum.repos.d/
  epel(RHEL 7)
      wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
  epel(RHEL 6)
      wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
  epel(RHEL 5)
      wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-5.repo

更换查看帮助的网站https://opsx.alibaba.com/mirror

补充yum命令

  yum -y install tree nmap sysstat lrzsz dos2unix telnet
  yum install -y tree lrzsz
06 设定运行级别为3(文本模式)

设定运行级别(runlevel)为3,即表示使用文本命令行模式管理Linux,如果按照前面要求完成的系统安装,则无需设置,检查一下即可。检查命令如下:

  [root@web01 ~]# cat /etc/inittab
  # For information on how to write upstart event handlers, or how
  # upstart works, see init(5), init(8), and initctl(8).
  #linux不同状态,用不同数字表示。
  # Default runlevel. The runlevels used are:
  #   0 - halt (Do NOT set initdefault to this)
  #   1 - Single user mode                        #单用户模式
  #   2 - Multiuser, without NFS (The same as 3, if you do not have networking) #多用户模式,没有NFS。
  #   3 - Full multiuser mode                     #完全的多用户模式,命令行模式
  #   4 - unused                                  #没有使用
  #   5 - X11                                     #图形界面模式,桌面模式
  #   6 - reboot (Do NOT set initdefault to this) #重启
  #
  id:3:initdefault:
  # 切换运行级别:
  init 6    ##重启电脑
  init 0    ##关机

命令说明:

  • runlevel:查看当前系统运行级别。
  • init:切换运行级别,后面接对应级别的数字,例如:init 6就是重启linux服务器了。
07 linux特殊变量--调整历史记录以及终端超时

命令行临时生效:

  #export TMOUT=300       #连接超时时间控制变量
  #export TMOUT=3       #3秒之后,没有任何输入,则自动退出。timed out waiting for input: auto-logout
  export HISTSIZE=5      #history size命令行历史记录数量  history 命令显示的条数
  export HISTFILESIZE=5  #命令行命令对应的历史记录文件,文件中命令记录数 ~/.bash_history

永久生效:
放入到/etc/profile
source 生效
了解如何配置即可,我们学习环境可以不配置。

08 隐藏Linux版本信息显示

在登录到Linux主机本地(非CRT连接的窗口)前,会显示系统的版本和内核。
登录后执行如下命令上产上述登录Linux前的终端内容显示的实际存放文件。

  [root@LuffyCity ~]# > /etc/issue
  [root@LuffyCity ~]# > /etc/issue.net
  [root@LuffyCity ~]# cat /etc/issue
  [root@LuffyCity ~]# cat /etc/issue.net
09 精简开机系统启动

和Windows系统一样,在Linux服务器运行的过程中,也会有很多无用的软件服务默认就在运行,这些服务占用了很多系统资源,而且也带来了安全隐患,因此要关闭掉。那么,企业生产场景的Linux主机到底需要保留哪些开机启动的服务呢?
重要的开机自启动服务
network|sshd|crond|rsyslog|sysstat

  egrep -v "network|sshd|crond|rsyslog|sysstat"

sshd

  • 远程连接Linux服务器时需要用到这个服务程序,所以必须要开启,Linux服务器就无法提供远程连接服务了。

rsyslog

  • 日志相关软件,这是操作系统提供的一种机制,系统的守护程序通常会使用rsyslog程序将各种信息写到各个系统日志文件中,Centos6以前此服务的名字为syslog。

network

  • 系统启动时,若想激活/关闭各个网络接口,则应(必须)考虑开启。

crond

  • 该服务用于周期性地执行系统及用户配置的任务计划。有要周期性执行的任务时,就要开启,此服务几乎是生产场景必须要用的一个软件。

sysstat

  • sysstat是一个软件包,包含监测系统性能及效率的一组工具,这些工具对于我们收集系统性能数据很有帮助,比如CPU使用率、硬盘和网络吞吐数据等,对这些数据的收集和分析,有利于判断系统运行是否正常,所以它是提高系统运行效率、安全运行服务器的得力助手。
10 利用sudo控制用户对系统命令的使用权限

不用root帐号是安全了,但管理不方便了,为了既安全又管理方便,可将需要root权限的普通用户加入sudo管理,这样用户就可以通过自己的普通帐户登录实现利用root的权限来管理系统了,当然也就不需要有root账号及密码了。
==>用户管理深度讲解(企业案例)
执行如下visudo命令,即可打开sudo的配置文件进行编辑。

  [root@LuffyCity ~]#visudo  #→相当于直接编辑/etc/sudoers,但用命令方式更安全,推荐。

在/etc/sudoers文件的大约第98行下面添加需要提升为root权限的普通用户名及对应权限,格式如下:

  visudo或者vi /etc/sudoers,再98行下面加入,也可以在其它位置加入。
  root    ALL=(ALL)                      ALL <==此行是98行
  luffy  ALL=(ALL)                     /usr/sbin/useradd,/usr/sbin/userdel

sudo提权配置说明

用户或组机器=(授权角色)可以执行的命令
userMACHINE\=COMMANDS
luffyALL=(ALL)/usr/sbin/useradd,/usr/sbin/userdel

提示:
如果luffy用户被授予上述权限,那么它可在所有的机器上以所有的角色运行useradd、userdel命令。
如果是针对用户组,则对应的授权命令如下:

  %用户组  机器=(授权使用哪个角色的权限)  /usr/sbin/useradd

通过sudo进行授权管理系统的目的:即能让运维人员干活,又不能威胁系统安全,其实就是前面讲的用户权限最小化原则,还可以审计用户使用sudo的提权操作命令。
为了管理方便,这里暂时给luffy授权all权限,即可以管理整个系统。
详细操作过程为:输入visudo找到98行,并在该行下面放入如下内容。

  luffy  ALL=(ALL)       NOPASSWD: ALL
  #→这个配置结尾的ALL表示luffy可拥有完全的系统管理权限,NOPASSWD表示提权执行命令时不提示密码

配置完成后要进行检查,命令如下:

  [root@LuffyCity ~]# grep luffy /etc/sudoers
  luffy  ALL=(ALL)       NOPASSWD: ALL

也可以使用快速操作命令增加sudo授权,仅限于批量管理的情况:

  \cp /etc/sudoers /etc/sudoers.ori
  echo "luffy  ALL=(ALL) NOPASSWD: ALL " >>/etc/sudoers
  tail -1 /etc/sudoers
  visudo -c #→直接追加内容没有语法检查,因此要单独执行语法检查命令。

将以上信息更改后,保存退出。
此时再以luffy用户登录系统时,就可以通过执行类似sudo ls -l /root (sudo后面加正常命令)的命令来以root用户的权限管理系统了,如下:

  [luffy@LuffyCity ~]$ ls /root
  ls: cannot open directory /root: Permission denied
  #→可以看到,luffy用户是无法直接访问访问/root家目录的
  [luffy@LuffyCity ~]$ sudo ls /root
  anaconda-ks.cfg  install.log  install.log.syslog  
  #→通过sudo命令,使得luffy用户具备了访问/root目录的权限

说明:

  • 通过sudo授权管理后,所有用户执行授权的特殊权限格式为“sudo 命令”。
  • 如果需要切换到root执行相关操作,可以通过“sudo su -”命令,注意,此命令提示的密码为当前用户的密码,而不是root的密码。
  • 执行“sudo -l”命令可以查看当前用户被授予的sudo权限集合。如下:

    [luffy@LuffyCity ~]$ sudo -l
    [sudo] password for luffy:
    Matching Defaults entries for luffy on this host:
    User luffy may run the following commands on this host:
        (ALL) /usr/sbin/useradd, (ALL) /usr/sbin/userdel
    
  • 对于Linux系统bash的内置命令,一般无法进行sudo授权,例如:cd命令。
11 Linux系统安全最小化原则说明

最小化原则对Linux系统安全来说极其重要:即多一事不如少一事。具体包括如下几个基本方面:

  • 安装Linux系统最小化,即选包最小化,yum安装软件包也要最小化,无用的包不装。
  • 开机自启动服务最小化,即无用的服务不开启。
  • 操作命令最小化。例如:能用“rm -f test.txt”就不用“rm -fr test.txt”。
  • 登录Linux用户最小化。平时没有特殊需求不登录root,用普通用户登录即可。
  • 普通用户授权权限最小化,即只给用户必须的管理系统的命令,不能啥都可以干。
  • Linux系统文件及目录的权限设置最小化,禁止随意创建、更改、删除文件。
  • 程序服务运行最小化,即程序服务运行应尽量不用root身份运行。
12 更改SSH服务端远程登录的配置

Windows服务器的默认远程管理端口是3389,管理员用户是administrator,普通用户是guest。Linux的管理用户是root,普通用户默认有很多个,远程连接默认端口port 22。这些通常搞IT的人都知道。那么黑客是否也知道呢?他们当然知道,甚至比我们更清楚,所以,为了系统安全要隐藏或更改上述默认的配置才行。更改配置的命令如下:

  [root@LuffyCity ~]#cp /etc/ssh/sshd_config /etc/ssh/sshd_config.ori
  #→更改配置前进行备份,是系统管理员的一个良好的习惯。
  [root@LuffyCity ~]#vi /etc/ssh/sshd_config  #→编辑sshd_config
  Port 52113
  PermitRootLogin no
  PermitEmptyPasswords no
  UseDNS no
  GSSAPIAuthentication no
  简单写法:cp /etc/ssh/sshd_config{,.ori}

其中,sshd_config修改的相关参数说明下表。

参数说明
Port指定sshd守护进程监听的端口号,默认为 22 。默认在本机的所有网络接口上监听,也可以通过 ListenAddress 指定只在某个特定的接口上监听。
端口范围:0~65535,不能和已有的服务端口冲突。
一般建议改为比1024大的端口
 
PermitEmptyPasswords是否允许密码为空的用户远程登录。默认为"no"
PermitRootLogin是否允许root登录。可用值如下:
"yes"(默认)表示允许;"no"表示禁止;
"without-password"表示禁止使用密码认证登录;
"forced-commands-only"表示只有在指定了 command 选项的情况下才允许使用公钥认证登录,同时其他认证方法全部被禁止,这个值常用于做远程备份之类的事情
UseDNS指定sshd是否应该对远程主机名进行反向解析,以检查此主机名是否与其IP地址真实对应。默认值为"yes"。
建议改成"no",否则可能会导致SSH连接很慢
GSSAPIAuthentication no解决Linux之间使用SSH远程连接慢的问题

将以上信息更改后,保存退出。
执行如下命令重启sshd,使修改的配置生效:

  /etc/init.d/sshd reload
13 设置Linux服务器时间同步
14 历史记录数及登录超时环境变量设置

1)设置闲置账号超时时间
设置闲置账号超时时间的示例命令如下,注意此处的配置仅临时生效。

  [root@LuffyCity ~]# export TMOUT=10 #设置连接会话的超时时间
  [root@LuffyCity ~]#
  timed out waiting for input: auto-logout #10秒提示超时

2)设置Linux的命令行历史记录数
设置Linux命令行的历史记录数示例命令如下,注意此处的配置仅临时生效。

  [root@LuffyCity ~]# export HISTSIZE=5
  [root@LuffyCity ~]# history
     42  whoami
     43  TMOUNT=10  #连接的超时时间
     44  TMOUT=10   
     45  HISTSIZE=5
     46  history

设定用户的命令行历史记录文件(~/.bash_history)记录指定命令数量的示例命令如下,注意此处的配置仅临时生效。

  [root@LuffyCity ~]# export HISTFILESIZE=5
  [root@LuffyCity ~]# cat ~/.bash_history
  ifdown eth0
  ls
  ls
  rz
  ls #可以看到文件里记录命令的数量也变少了。

把上述命令放入配置文件,使其可以永久生效。

  [root@LuffyCity ~]# echo 'export TMOUT=300' >>/etc/profile
  [root@LuffyCity ~]# echo 'export HISTSIZE=5' >>/etc/profile
  [root@LuffyCity ~]# echo 'export HISTFILESIZE=5' >>/etc/profile
  [root@LuffyCity ~]# tail -3 /etc/profile
  export TMOUT=300
  export HISTSIZE=5
  export HISTFILESIZE=5
  [root@LuffyCity ~]# source /etc/profile #使得配置文件生效

在上述命令中,涉及的系统控制变量说明如下:

  • TMOUT=10:连接的超时时间控制变量。
  • HISTSIZE=5:命令行的历史记录数量变量。
  • HISTFILESIZE=10 :历史记录文件的命令数量变量(~/.bash_history)。

提示:实际工作中类似的变量还有不少,大家可以根据企业工作需求选择使用,最好执行前加上export命令,更多linux系统的环境变量,大家可以执行man bash查询。

15 调整linux系统文件描述符数量

文件描述符是由无符号整数表示的句柄,进程使用它来标识打开的文件。文件描述符与包括相关信息(如文件的打开模式、文件的位置类型、文件的初始类型等)的文件对象相关联,这些信息被称作文件的上下文。文件描述符的有效范围是0到OPEN_MAX。
对于内核而言,所有打开的文件都是通过文件描述符引用的。当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符。当读或写一个文件时,使用open或creat返回的文件描述符标识该文件,并将其作为参数传递给read或write,文件描述符定义的内容如下。

  /* Standard file descriptors. */
  #define STDIN_FILENO 0 /* Standard input. */
  #define STDOUT_FILENO 1 /* Standard output. */
  #define STDERR_FILENO 2 /* Standard error output. */

查看Linux服务器文件描述符设置的情况可以使用ulimit -n命令,文件描述符大小默认是1024。

  [root@LuffyCity ~]# ulimit -n
  1024

如果过小会提示:

  -bash: start_pipeline: pgrp pipe: Too many open files
  vim: error \while loading shared libraries: libm.so.6: cannot open shared object file: Error 24

对于高并发的业务linux服务器来说,这个默认的设置值是不够的,需要调整。
调整方法1:
执行vim /etc/security/limits.conf命令,再文件结尾加上如下一行。

  *               -       nofile          65535

或者直接执行如下一行命令追加上述内容到文件尾部:

  [root@LuffyCity ~]# echo '*               -       nofile          65535 ' >>/etc/security/limits.conf
  [root@LuffyCity ~]# tail -1 /etc/security/limits.conf
  *               -       nofile          65535

配置完成后,需重新登录才可以生效,查看如下:

  [root@LuffyCity ~]# ulimit -n
  65535

调整方法2:
直接把ulimit -SHn 65535命令加入到/etc/rc.local,用以设置每次开机启动时配置生效,命令如下。

  cat \>\>/etc/rc.local\<\<EOF
  #-S use the 'soft' resource limit
  #-H  use the 'hard' resource limit
  #-n  the maximum number of open file descriptors
  ulimit -HSn 65535
  #-s the maximum stack size
  ulimit -s 65535
  EOF
  1. 临时生效 ulimit -SHn 65535
  2. 永久生效 echo '* - nofile 65535 ' >>/etc/security/limits.conf
16 Linux服务器内核参数优化

所谓Linux服务器内核参数优化(本优化适合Apache、Nginx、Squid多种等Web应用,特殊的业务有可能需要略作调整。),主要是指在Linux系统中针对业务服务应用而进行的系统内核参数调整,优化并无一定的标准,下面以生产环境下Linux常见的内核优化为例进行讲解,仅供大家参考。
优化方法是,执行vi /etc/sysctl.conf命令到文件结尾,然后拷贝如下内容并保存。

  net.ipv4.tcp_fin_timeout = 2
  net.ipv4.tcp_tw_reuse = 1
  net.ipv4.tcp_tw_recycle = 1
  net.ipv4.tcp_syncookies = 1
  net.ipv4.tcp_keepalive_time = 600
  net.ipv4.ip_local_port_range = 4000    65000
  net.ipv4.tcp_max_syn_backlog = 16384
  net.ipv4.tcp_max_tw_buckets = 36000
  net.ipv4.route.gc_timeout = 100
  net.ipv4.tcp_syn_retries = 1
  net.ipv4.tcp_synack_retries = 1
  net.core.somaxconn = 16384
  net.core.netdev_max_backlog = 16384
  net.ipv4.tcp_max_orphans = 16384

  net.nf_conntrack_max = 25000000
  net.netfilter.nf_conntrack_max = 25000000
  net.netfilter.nf_conntrack_tcp_timeout_established = 180
  net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
  net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
  net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120

将上面的内核参数值加入/etc/sysctl.conf文件中,然后执行如下命令sysctl -p使之生效:

  [root@LuffyCity ~]# sysctl -p            
  net.ipv4.ip_forward = 0
  net.ipv4.conf.default.rp_filter = 1
  net.ipv4.conf.default.accept_source_route = 0
  kernel.sysrq = 0
  kernel.core_uses_pid = 1
  net.ipv4.tcp_syncookies = 1
  error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key
  error: "net.bridge.bridge-nf-call-iptables" is an unknown key
  error: "net.bridge.bridge-nf-call-arptables" is an unknown key
  kernel.msgmnb = 65536
  kernel.msgmax = 65536
  kernel.shmmax = 68719476736
  kernel.shmall = 4294967296
  net.ipv4.tcp_fin_timeout = 2
  net.ipv4.tcp_tw_reuse = 1
  net.ipv4.tcp_tw_recycle = 1
  net.ipv4.tcp_syncookies = 1
  net.ipv4.tcp_keepalive_time = 600
  net.ipv4.ip_local_port_range = 4000    65000
  net.ipv4.tcp_max_syn_backlog = 16384
  net.ipv4.tcp_max_tw_buckets = 36000
  net.ipv4.route.gc_timeout = 100
  net.ipv4.tcp_syn_retries = 1
  net.ipv4.tcp_synack_retries = 1
  net.core.somaxconn = 16384
  net.core.netdev_max_backlog = 16384
  net.ipv4.tcp_max_orphans = 16384
  net.nf_conntrack_max = 25000000
  net.netfilter.nf_conntrack_max = 25000000
  error: "net.netfilter.nf_conntrack_tcp_timeout_established" is an unknown key
  error: "net.netfilter.nf_conntrack_tcp_timeout_time_wait" is an unknown key
  error: "net.netfilter.nf_conntrack_tcp_timeout_close_wait" is an unknown key
  error: "net.netfilter.nf_conntrack_tcp_timeout_fin_wait" is an unknown key

如果是Centos6环境下面,必须开启ip6tables服务才不会出现上面报错,其实报错也可以暂时不理,这是针对防火墙的优化,而这里的防火墙并没有开启,将来开启了就好了。
sysctl.conf内核文件中的参数含义见下表。

参数说明
net.ipv4.tcp_fin_timeout表示套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间,默认值是60秒。
该参数对应系统路径为:/proc/sys/net/ipv4/tcp_fin_timeout 60
net.ipv4.tcp_tw_reuse表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认值为0,表示关闭。
该参数对应系统路径为:/proc/sys/net/ipv4/tcp_tw_reuse 0
net.ipv4.tcp_tw_recycle表示开启TCP连接中TIME-WAIT sockets的快速回收。
该参数对应系统路径为:/proc/sys/net/ipv4/tcp_tw_recycle ,默认为0,表示关闭。
提示:reuse和recycle这两个参数是为防止生产环境下web、squid等业务服务器time_wait网络状态数量过多设置的。
net.ipv4.tcp_syncookies表示开启SYN Cookies功能。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,centos5系列默认值为1,表示开启,因此这个参数也可以不添加。
该参数对应系统路径为:/proc/sys/net/ipv4/tcp_syncookies, 默认为1
net.ipv4.tcp_keepalive_time表示当keepalive启用的时候,TCP发送keepalive消息的频度。默认是2小时,建议改为10分钟。
该参数对应系统路径为:/proc/sys/net/ipv4/tcp_keepalive_time ,默认为7200秒。
net.ipv4.ip_local_port_range该选项用来设定允许系统打开的端口范围,即用于向外连接的端口范围。
该参数对应系统路径为:/proc/sys/net/ipv4/ip_local_port_range 32768 61000
net.ipv4.tcp_max_syn_backlog表示SYN队列的长度,默认为1024,建议加大队列的长度为8192或更多,这样可以容纳更多等待连接的网络连接数。该参数为服务器端用于记录那些尚未收到客户端确认信息的连接请求最大值。
该参数对应系统路径为:/proc/sys/net/ipv4/tcp_max_syn_backlog
net.ipv4.tcp_max_tw_buckets表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,对于Apache、Nginx等服务器来说可以将其调低一点,如改为5000~30000,不同业务的服务器也可以给大一点,比如lvs、squid。
此项参数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。
该参数对应系统路径为:/proc/sys/net/ipv4/tcp_max_tw_buckets
net.ipv4.tcp_synack_retries参数的值决定了内核放弃连接之前发送SYN+ACK包的数量。
该参数对应系统路径为:/proc/sys/net/ipv4/tcp_synack_retries,默认值为5
net.ipv4.tcp_syn_retries表示在内核放弃建立连接之前发送SYN包的数量。
该参数对应系统路径为:/proc/sys/net/ipv4/tcp_syn_retries 5
net.ipv4.tcp_max_orphans用于设定系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤立连接将立即被复位并打印出警告信息。这个限制只是为了防止简单的DoS攻击。不能过分依靠这个限制甚至人为减小这个值,更多的情况是增加这个值。
该参数对应系统路径为:/proc/sys/net/ipv4/tcp_max_orphans 65536
net.core.somaxconn该选项默认值是128, 这个参数用于调节系统同时发起的TCP连接数,在高并发的请求中,默认的值可能会导致链接超时或重传,因此,需要结合并发请求数来调节此值。
该参数对应系统路径为:/proc/sys/net/core/somaxconn 128
net.core.netdev_max_backlog表示当每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许发送到队列的数据包最大数。
该参数对应系统路径为:/proc/sys/net/core/netdev_max_backlog, 默认值为1000
17 定时清理邮件服务临时目录垃圾文件

==>inode、定时任务的企业案例
CentOS5系列的系统会默认安装Sendmail服务,因此邮件临时存放地点的路径为/var/spool/clientmqueue/。
CentOS6默认情况下没有安装Sendmail服务,而是改装了Postfix服务,因此邮件临时存放地点的路径为/var/spool/postfix/maildrop/。
以上两个目录很容易被垃圾文件填满导致系统的inode数量不够用,从而导致无法存放文件。
手动清理的方法如下:

  [root@LuffyCity ~]# find /var/spool/clientmqueue/ -type f|xargs rm -f   适合Centos5的Sendmail服务
  [root@LuffyCity ~]# find /var/spool/postfix/maildrop/ -type f|xargs rm -f #适合Centos6的Postfix服务

定时清理的方法为:将上述命令写成脚本,然后做成定时任务,每天晚上0点执行一次。
下面以Centos6为例讲解,命令如下:

  [root@LuffyCity ~]# mkdir -p /server/scripts
  [root@LuffyCity ~]# echo "find /var/spool/postfix/maildrop/ -type f|xargs rm -f" >/server/scripts/del_file.sh
  [root@LuffyCity ~]# cat /server/scripts/del_file.sh
  find /var/spool/postfix/maildrop/ -type f |xargs rm -f
  [root@LuffyCity ~]# echo "00 00 * * * /bin/sh /server/scripts/del_file.sh >/dev/null 2>&1" >>/var/spool/cron/root
  [root@LuffyCity ~]# crontab -l
  00 00 * * 0 /bin/sh /server/scripts/del_file.sh >/dev/null 2>&1
  [root@web01 ~]# df -i  #查看磁盘inode总量、剩余量、使用量
  Filesystem     Inodes IUsed  IFree IUse% Mounted on
  /dev/sda3      479552 55781 423771   12% /
  tmpfs          127032     1 127031    1% /dev/shm
  /dev/sda1       51200    38  51162    1% /boot
18 锁定关键系统文件,防止提权被篡改

要锁定关键系统文件,必须对账号密码文件及启动文件加锁,防止被篡改。上锁命令如下:

  chattr +i /etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/inittab

提示:上锁后,所有用户都不能对文件修改删除。
解锁的命令如下:

  chattr -i /etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/inittab

提示:上锁后,如需临时操作,可以解锁后对文件进行修改,之后再上锁。

  想要更为安全,可以把chattr改名转移,防止被黑客利用。命令如下:
  [root@LuffyCity ~]# mv /usr/bin/chattr /usr/bin/luffy1
  [root@LuffyCity ~]# chattr -i /etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/inittab
  -bash: /usr/bin/chattr: 没有那个文件或目录
  [root@LuffyCity ~]# luffy1 -i /etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/inittab
  [root@LuffyCity ~]# lsattr /etc/passwd 查看被上锁后的文件属性
  ----i--------e- /etc/passwd
  提示:chattr有很多参数,例如:-a等,如果读者要了解更多,请man chattr。
19 清除多余的系统虚拟账号

操作前要先根据公司系统提供的服务确定哪些账号不需要使用,如果不确定就不要操作了,一般情况下,一个规范的系统提供的服务都比较少,因此,系统中默认的绝大多数虚拟用户都是可以删掉(不直接删除,注释即可)的,例如:bin、adm、lp、halt、mail、uucp、operator、games、gopher、ftp、dbus、vcsa、abrt、ntp、saslauth、postfix、tcpdump等。这些用户本身也是无法登录的,因此,此项优化不是必须的。

20 为grub菜单加密码
21 禁止Linux系统被ping

此项优化不是必须的,而且有时我们自己也会通过ping来检查服务器是否异常,对于要求很高的中小企业服务器,设置禁止ping也是可以的。从安全角度来说,禁止ping还是会增加系统安全的。禁止ping的命令如下:

[root@LuffyCity ~]# echo "net.ipv4.icmp_echo_ignore_all=1" >> /etc/sysctl.conf
[root@LuffyCity ~]# tail -1 /etc/sysctl.conf 
net.ipv4.icmp_echo_ignore_all=1
[root@LuffyCity ~]# sysctl -p

其实这个禁ping的方法不是好的策略,因为禁止ping后,我们自己也无法通过ping检查了。还原上述禁ping的操作,因为工作中用的较少:

  删除/etc/sysctl.conf中的net.ipv4.icmp_echo_ignore_all=1,保存后,
  并执行如下命令
  echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all

比较好的策略是通过iptables设置让特定的IP可以ping,例如:让内网用户ping,其他外部用户不能ping。例如:在默认策略为drop的情况下,可以执行如下命令,为10.0.0.0/24网段允许ping。

  iptables -t filter  -I INPUT -p icmp --icmp-type 8 -i eth0 -s 10.0.0.0/24 -j ACCEPT
22 升级具有典型漏洞的软件版本

诸如openssl、openssh、bash爆出很多软件漏洞,在企业场景需要进行修复漏洞操作,步骤如下:
1)首先查看相关软件的版本号。

  [root@LuffyCity ~]# rpm -qa openssl openssh bash
  openssl-1.0.1e-30.el6.x86_64
  bash-4.1.2-29.el6.x86_64
  openssh-5.3p1-104.el6.x86_64

2)执行升级已知漏洞的软件版本到最新,命令如下:

  [root@LuffyCity ~]# yum install openssl openssh bash -y
  [root@LuffyCity ~]# rpm -qa openssl openssh bash
  openssh-5.3p1-104.el6_6.1.x86_64
  bash-4.1.2-29.el6.x86_64
  openssl-1.0.1e-30.el6_6.5.x86_64

转载于:https://my.oschina.net/u/4005625/blog/2252061

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值