Linux服务器安全策略配置-SSH与动态MOTD(一)

简介:

Linux登录提示(静态/动态MOTD)

在用户输入口令或使用密钥成功登录后,让服务器自动为我们执行几个简单的操作,如打印提示信息,打印异常信息,执行一个脚本,或者发送邮件等。能够预先提示信息给登录者,让我们在登录机器采取任何操作之前,可以快速的了解这台机器的重要信息。看起来是不是很有意思呢? 也许我们会想,这对于服务器的安全加固并没有直接的影响,而且每次刚刚登录就执行一系列命令、脚本(如收集服务器资源使用情况的信息),似乎也有点多余。因此,如果是在生产环境的Linux服务器并且需要配置登录提示,诸如登录执行命令、脚本等这些操作,我们不必为此写一个复杂的、庞大的脚本,脚本的执行时间很关键,如果你不想在正确输入登录密码后仍需等待几秒或更长的时间,那么,尽可能地把脚本的执行耗时优化到几毫秒,甚至更低。(登录后的提示或操作尽可能简单的、有利的是最好的。如果你想这么做)


    在大多数Linux分发版中,可以直接修改/etc/motd文件来定制任何想要的提示信息,修改方法是将需要打印的提示消息文件粘贴到该文件中即可(一些可执行命令或脚本在文件中仅仅被当作是普通字符/文本)/etc/motd内的文本消息是固定不变,除非我们手动修改它。因此,在/etc/motd中定制的消息是静态MOTD


    如果你使用过Debian/Ubuntu分发版,你可能已经发现,Ubuntu默认就已经有一个动态的MOTD信息提示(通过SSH或本地登录时显示系统当前的一些信息)。在RHEL/CentOS中不可能实现像在Debian/Ubuntu中这样的功能,因为RHEL/CentOS并没有提供与之相关的任何脚本。我们可以通过环境变量文件,如/etc/profile/etc/bashrc等,将需要执行的命令或脚本添加到这些文件末尾,这样当每次用户登陆时,系统就会读取这些文件,执行文件里定义好的脚本。除此之外,也可以结合使用crontab计划任务,将预先准备好的脚本,如系统监控,异常信息收集通过crontab在后台定期执行,并把收集到的信息重定向写到/etc/motd文件中。在用户登录系统时,就可以显示这些系统监控、异常处理信息了。


    在Ubuntu中,提供了一组脚本在目录/etc/update-motd.d/中,在用户登录时,按照脚本名字前缀的数字(00-99)顺序执行,并将这些脚本的输出保存到文件/run/motd.dynamic中,最终用户成功登录后,在登录的屏幕界面中打印出来。输出结果如下图所示

wKioL1kK2wCSa2whAADDmvKMfcM551.png

/etc/update-motd.d/脚本列表:

00-header  

10-help-text  

50-landscape-sysinfo  

90-updates-available  

91-release-upgrade  

98-fsck-at-reboot  

98-reboot-required

以上是在Ubuntu 14.04 LTS中默认的提供动态MOTD消息的脚本,这些脚本可以修改,也可以增加自己的脚本。比如替换为自己的定制好的脚本。


下面我给出在RHEL/CentOS中定制MOTD的几个简单操作示例:

打印提示信息,执行一个脚本,或者发送邮件

任何用户远程或本地登录后打印提示信息(如提示登录者这是一台重要的服务器,要求登录者谨慎操作)


>> 开启SSH服务打印MOTD消息,配置文件/etc/ssh/sshd_config,确认是否如下配置(默认为yes)

1
PrintMotd  yes


>> 修改/etc/motd文件,将提示消息粘贴到该文件中

1
2
3
4
5
[root@localhost ~] # cat /etc/motd 
***************************************************
* 注意: 这是一台重要的生产服务器,请谨慎操作!!  *
*       如需要重启/关闭服务器,请先将NFS卸载      *
***************************************************

>> 保存之后,使用SSH登录该服务器,输入正确的账号密码之后,提示如下

wKiom1kK22LjflnIAABfdbNQaRc453.png

当然,仅仅像这样简单的提示远远不够,我们可以根据这台服务器的特征、运行的服务、文件系统信息以及重要的细节信息等打印出来,让其他的IT人员登录该服务器时,在采取任何操作之前,可以快速的掌握这台服务器的重要信息。也可以起到一个警惕的作用。你可以根据自己的情况定制。


RHEL/CentOS中打印动态MOTD提示

>> 任何用户通过SSH远程登录打印提示如下

wKiom1kK24XCPAv1AACc12pT7z8902.png


>> 创建系统信息收集脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
[root@HMing ~] # vim /usr/src/scripts/system_info.sh 
#!/bin/bash
  
date =` date  "+%F %T" `
head = "System information as of: $date"
  
kernel=` uname  -r`
hostname =` echo  $HOSTNAME`
  
#Cpu load
load1=` cat  /proc/loadavg  awk  '{print $1}' `
load5=` cat  /proc/loadavg  awk  '{print $2}' `
load15=` cat  /proc/loadavg  awk  '{print $3}' `
  
#System uptime
uptime=` cat  /proc/uptime  cut  -f1 -d.`
upDays=$((uptime /60/60/24 ))
upHours=$((uptime /60/60 %24))
upMins=$((uptime /60 %60))
upSecs=$((uptime%60))
up_lastime=` date  -d  "$(awk -F. '{print $1}' /proc/uptime) second ago"  + "%Y-%m-%d %H:%M:%S" `
  
#Memory Usage
mem_usage=` free  -m |  awk  '/Mem:/{total=$2} /buffers\/cache/ {used=$3} END {printf("%3.2f%%",used/total*100)}' `
swap_usage=` free  -m |  awk  '/Swap/{printf "%.2f%",$3/$2*100}' `
  
#Processes
processes=` ps  aux |  wc  -l`
  
#User
users =` users  wc  -w`
USER=` whoami `
  
#System fs usage
Filesystem=$( df  -h |  awk  '/^\/dev/{print $6}' )
  
#Interfaces
INTERFACES=$(ip -4 ad |  grep  'state '  awk  -F ":"  '!/^[0-9]*: ?lo/ {print $2}' )
  
echo
echo  "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
echo  "$head"
echo  "----------------------------------------------"
printf  "Kernel Version:\t%s\n"  $kernel
printf  "HostName:\t%s\n"  $ hostname
printf  "System Load:\t%s %s %s\n"  $load1, $load5, $load15
printf  "System Uptime:\t%s " days " %s " hours " %s " min " %s " sec "\n"  $upDays $upHours $upMins $upSecs
printf  "Memory Usage:\t%s\t\t\tSwap Usage:\t%s\n"  $mem_usage $swap_usage
printf  "Login Users:\t%s\t\t\tWhoami:\t\t%s\n"  $ users  $USER
printf  "Processes:\t%s\n"  $processes
printf  "\n"
printf  "Filesystem\tUsage\n"
for  in  $Filesystem
do
     Usage=$( df  -h |  awk  '{if($NF=="' '' $f '' '") print $5}' )
     echo  -e  "$f\t\t$Usage"
done
printf  "\n"
printf  "Interface\tMAC Address\t\tIP Address\n"
for  in  $INTERFACES
do
     MAC=$(ip ad show dev $i |  grep  "link/ether"  awk  '{print $2}' )
     IP=$(ip ad show dev $i |  awk  '/inet / {print $2}' )
     printf  $i "\t\t" $MAC "\t$IP\n"
done
echo  "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
echo


>> 给脚本增加执行权限

1
[root@HMing ~] # chmod +x /usr/src/scripts/system_info.sh


>> 将脚本的路径名添加到/etc/profile文件末尾

1
2
[root@HMing ~] # tail -1 /etc/profile
/usr/src/scripts/system_info .sh


任何用户远程或本地登录后发送邮件信息

>> 演示如下

wKioL1kK2_Kg5PwKAABGi-HBlTo926.png


>> 发送邮件如下

wKioL1kK3AnQDCW3AABD80PMTBo209.png

>> 创建一个发送邮件的脚本/usr/src/scripts/my-server-login-mail,如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/bin/bash
smtp=smtp.163.com
smtp_auth_user=xxxxxx
smtp_auth_password=xxxxxxxxxx
from=xxxxxxxx@163.com
  
function  HEAD {
     Kernel_version=` uname  -r`
     Login_user=`last -a |  grep  "logged in"  wc  -l`
     Up_lastime=` date  -d  "$(awk -F. '{print $1}' /proc/uptime) second ago"  + "%Y-%m-%d %H:%M:%S" `
     Up_runtime=` cat  /proc/uptime awk  -F. '{run_days=$1 / 86400;run_hour=($1 % 86400) /3600 ;run_minute=($1 % 3600) /60 ;run_second
=$1 % 60; printf ( "%d天%d时%d分%d秒" ,run_days,run_hour,run_minute,run_second)}'`
     Last_user=`last |  awk  '( /pts/ ) && ( /-/ ){print  "User: " $1 " - " "OlineTime: " $NF " - " "IP: " $3 " - " "LoginTime: " $4 " " $5 " " $6 " "
$7} '| head -1 | sed -e ' s/( //g ' -e ' s/) //g '`
     echo  -e  ""
     echo  -e "\
     邮件提示: 未知身份来源使用${USER}用户登录系统 
     -------------------------------------------------------------
                             System information
     主机名: $HOSTNAME
     内核版本: $Kernel_version
     系统已运行时间: $Up_runtime
     上一次重启时间: $Up_lastime
     当前登入用户数: $Login_user
     上一次登入用户: $Last_user
     -------------------------------------------------------------
     "
};HEAD > /tmp/ .loginmail
  
title= "主机:`echo $HOSTNAME`登录提示 (`date " +%F %T "`)"
body=` cat  /tmp/ .loginmail`
to=741616710@qq.com
  
sendEmail -s  "$smtp"  -xu  "${smtp_auth_user}"  -xp  "${smtp_auth_password}"  -f  "$from"  -t  "$to"  -u  "$title"  -m  "$body"  &> /dev/null
  &&  rm  -rf  /tmp/ .loginmail

Linux发送邮件的程序有很多,在这里我用的是sendEmail,你也可以使用其他的发送邮件程序。


>> 将脚本绝对路径名添加到/etc/profile文件末尾

1
2
[root@HMing ~] # tail -1 /etc/profile
/usr/src/scripts/my-server-login-mail


结语

   动态的MOTD在Ubuntu中是开箱即用的,因为它已经被集成为系统的一个模块,通过pam_motd.so调用。不过,我们可以随时修改系统上预先配置好的脚本,将脚本放到/etc/update-motd.d/目录中,比如收集系统异常信息脚本,在用户登录时,将在第一时间反馈给用户,或者是系统登录记录的实时监控,通过发生邮件给用户,用户可以快速掌握服务器是否存在被入侵的情况。对于RHEL/CentOS发行版,我在文中也给出了几个简单的演示示例,实现动态MOTD。有兴趣同学的可以作为参考。

本文转自 HMLinux 51CTO博客,原文链接:http://blog.51cto.com/7424593/1922111


相关文章
|
2月前
|
缓存 并行计算 Linux
深入解析Linux操作系统的内核优化策略
本文旨在探讨Linux操作系统内核的优化策略,包括内核参数调整、内存管理、CPU调度以及文件系统性能提升等方面。通过对这些关键领域的分析,我们可以理解如何有效地提高Linux系统的性能和稳定性,从而为用户提供更加流畅和高效的计算体验。
43 2
|
2月前
|
缓存 网络协议 Linux
深入探索Linux操作系统的内核优化策略####
本文旨在探讨Linux操作系统内核的优化方法,通过分析当前主流的几种内核优化技术,结合具体案例,阐述如何有效提升系统性能与稳定性。文章首先概述了Linux内核的基本结构,随后详细解析了内核优化的必要性及常用手段,包括编译优化、内核参数调整、内存管理优化等,最后通过实例展示了这些优化技巧在实际场景中的应用效果,为读者提供了一套实用的Linux内核优化指南。 ####
56 1
|
2月前
|
机器学习/深度学习 负载均衡 算法
深入探索Linux内核调度机制的优化策略###
本文旨在为读者揭开Linux操作系统中至关重要的一环——CPU调度机制的神秘面纱。通过深入浅出地解析其工作原理,并探讨一系列创新优化策略,本文不仅增强了技术爱好者的理论知识,更为系统管理员和软件开发者提供了实用的性能调优指南,旨在促进系统的高效运行与资源利用最大化。 ###
|
2月前
|
监控 关系型数据库 MySQL
Linux环境下MySQL数据库自动定时备份策略
在Linux环境下,MySQL数据库的自动定时备份是确保数据安全和可靠性的重要措施。通过设置定时任务,我们可以每天自动执行数据库备份,从而减少人为错误和提高数据恢复的效率。本文将详细介绍如何在Linux下实现MySQL数据库的自动定时备份。
79 3
|
4月前
|
安全 Linux 网络安全
Linux端的ssh如何升级?
Linux端的ssh如何升级?
415 59
|
2月前
|
监控 网络协议 算法
Linux内核优化:提升系统性能与稳定性的策略####
本文深入探讨了Linux操作系统内核的优化策略,旨在通过一系列技术手段和最佳实践,显著提升系统的性能、响应速度及稳定性。文章首先概述了Linux内核的核心组件及其在系统中的作用,随后详细阐述了内存管理、进程调度、文件系统优化、网络栈调整及并发控制等关键领域的优化方法。通过实际案例分析,展示了这些优化措施如何有效减少延迟、提高吞吐量,并增强系统的整体健壮性。最终,文章强调了持续监控、定期更新及合理配置对于维持Linux系统长期高效运行的重要性。 ####
|
2月前
|
安全 网络协议 Linux
Linux操作系统的内核升级与优化策略####
【10月更文挑战第29天】 本文深入探讨了Linux操作系统内核升级的重要性,并详细阐述了一系列优化策略,旨在帮助系统管理员和高级用户提升系统的稳定性、安全性和性能。通过实际案例分析,我们展示了如何安全有效地进行内核升级,以及如何利用调优技术充分发挥Linux系统的潜力。 ####
77 1
|
2月前
|
监控 Ubuntu Linux
使用VSCode通过SSH远程登录阿里云Linux服务器异常崩溃
通过 VSCode 的 Remote - SSH 插件远程连接阿里云 Ubuntu 22 服务器时,会因高 CPU 使用率导致连接断开。经排查发现,VSCode 连接根目录 ".." 时会频繁调用"rg"(ripgrep)进行文件搜索,导致 CPU 负载过高。解决方法是将连接目录改为"root"(或其他具体的路径),避免不必要的文件检索,从而恢复正常连接。
|
2月前
|
缓存 算法 Linux
Linux内核中的调度策略优化分析####
本文深入探讨了Linux操作系统内核中调度策略的工作原理,分析了不同调度算法(如CFS、实时调度)在多核处理器环境下的性能表现,并提出了针对高并发场景下调度策略的优化建议。通过对比测试数据,展示了调度策略调整对于系统响应时间及吞吐量的影响,为系统管理员和开发者提供了性能调优的参考方向。 ####
|
3月前
|
网络安全 虚拟化 Docker
SSH后判断当前服务器是云主机、物理机、虚拟机、docker环境
结合上述方法,您可以对当前环境进行较为准确的判断。重要的是理解每种环境的特征,并通过系统的响应进行综合分析。如果在Docker容器内,通常会有明显的环境标志和受限的资源视图;而在云主机或虚拟机上,虽然它们也可能是虚拟化的,但通常提供更接近物理机的体验,且可通过硬件标识来识别虚拟化平台。物理机则直接反映硬件真实信息,较少有虚拟化痕迹。通过这些线索,您应该能够定位到您所处的环境类型。
89 2