文章目录
阿里云密钥对登录
阿里云的密钥对创建以及使用crt登录,请参考:
使用SSH密钥对远程登录阿里云云服务器
使用linux自定义的密钥对创建:
设置ssh通过密钥登陆
配置SecureCRT使用SSH公钥方式登录Linux服务器
需要注意的是:
连接阿里云公网使用的是自己电脑的外网ip地址,查看自己的外网ip地址,可以直接百度ip就能找到自己的外网ip地址。
除此之外:
前面设置的是root用户的密钥对登录,但是使用root登录的风险太大了!所以一般都要使用普通用户登录。为了实现普通用户也能够使用密钥对登录,步骤如下:
阿里云生成的密钥对,其公钥是在/root/.ssh的目录下,如下:
将它复制到创建的用户的家目录下,例如用户为test。
cp -r /root/.ssh /home/test
之后将权限变更为test,如下:
chown -R test:group /home/test/.ssh
group为用户所属组,创建的时候不指定的话默认就是用户名
然后退出root登录,使用test用户密钥对登录,测试看是否成功!
感谢:
阿里云ECS服务器使用SSH密钥对登录,适用普通用户
用户
使用普通用户登陆
不能使用root用户登录,这样的风险实在太大,改用普通用户登录;并且为了安全着想还需要禁用root登录以及让普通用户限制其对其它目录的权限;
先使用root登录,然后登录之后第一时间修改root密码!!!!
先使用root登录,然后登录之后第一时间修改root密码!!!!
先使用root登录,然后登录之后第一时间修改root密码!!!!
1.创建一个组,这个组是只属于登录的用户;因为创建用户的时候想要指定组是必须要是已存在的组;
groupadd loginuser
2.创建替代root的用户,使用useradd命令,使用-m参数指定用户的家目录(不指定也会自动创建家目录),如下:
然后再使用passwd命令,设置用户的密码,如下:
3.既然设置了密码,那么对于密码的策略也需要设置,为了安全着想,使用vim命令,打开配置文件,修改 /etc/login.defs来实现:
PASS_MAX_DAYS 30 #密码30天过期
PASS_MIN_DAYS 1 #修改密码最小间隔为1天
PASS_MIN_LEN 8 #最短密码要求8位
PASS_WARN_AGE 7 #密码过期前7天内通知用户
同时需要添加一句,只能特定用户才能切换为root的配置:
SU_WHEEL_ONLY yes
之后wq保存
该 /etc/login.defs文件详解,参考:
Linux新建用户配置文件 /etc/login.defs 详解
4.既然选择了特定的用户可以su为root用户,也就是要将该用户设置为wheel组,才能生效,所以修改test为wheel组成员,如下:
ps:注意我这里使用G,表示添加附加组,并没有改变原来所属的组,而是在原来的基础上又添加了一个组;
5.还要修改su命令,修改/etc/pam.d/su,
去掉这行的注释,表示将只有wheel组的可切换为root
auth required pam_wheel.so use_uid
6.然后还有较为关键的一步,禁用root用户的远程登录,修改 /etc/ssh/sshd_config
将 #PermitRootLogin Yes 修改为 PermitRootLogin no
7.还有密码输入,为防止暴力破解,需要限制其密码输入次数;使用pam_tally2.so模块;
在使用这个模块之前,还需要查看是否有这个模块,如下:
find /lib* -iname "pam_tally2.so"
注意1:
如果是pam_tally.so模块的话,跟2不一样,请参考:
设置Linux用户连续N次输入错误密码进行登陆时,自动锁定X分钟
注意2
如果是CentOS8.0版本的话,使用的又不一样了。。。。
请参考:
CentOS 8.0配置安全策略(用户3次登录失败锁定3分钟)
然后修改之前,需要备份相应的文件,以防出错的话,就无法追溯了;
cp /etc/pam.d/sshd /etc/pam.d/sshd.back
cp /etc/pam.d/login /etc/pam.d/login.back
cp system-auth-ac system-auth-ac.back
a.设置服务器中密码输入策略:
修改:/etc/pam.d/system-auth
然后在第二行,添加如下:
auth required pam_tally2.so onerr=fail deny=3 unlock_time=30 even_deny_root root_unlock_time=30
表示普通用户和root用户,
在服务器本地shell输入密码错误三次,则会锁定账户30秒
参数含义:
even_deny_root 也限制root用户;
deny 设置普通用户和root用户连续错误登陆的最大次数,超过最大次数,则锁定该用户;
unlock_time 设定普通用户锁定后,多少时间后解锁,单位是秒;
root_unlock_time 设定root用户锁定后,多少时间后解锁,单位是秒;
注意必须要在第二行,因为不是第二行的话,就可以造成锁定账户后密码输入正确,还是能够登录,设置后测试如下:
这个文件的详细内容,博客:
Linux下/etc/pam.d/system-auth文件内容
b.设置远程中密码输入策略:
远程设置策略,其修改的语法还是一样的,也是:
auth required pam_tally2.so onerr=fail deny=3 unlock_time=30 even_deny_root root_unlock_time=30
但是前面已经设置了root用户是禁止登陆的,所以就不需要设置root用户的输入策略,改为:
auth required pam_tally2.so onerr=fail deny=3 unlock_time=30
还有就是修改的地方不一样了,改成了在/etc/pan.d下的login和sshd的配置文件,如下:
在login中:
在sshd中:
重启sshd,使用service sshd restart,让ssh配置生效:
然后远程我使用crt登陆三次错误密码之后,然后第四次用正确的密码登陆,也会提醒我密码错误,这样就大功告成了~~~
输入策略番外
根据:
CentOS 8.0配置安全策略(用户3次登录失败锁定3分钟)
设置Linux用户连续N次输入错误密码进行登陆时,自动锁定X分钟
可以推算出,在CentOS8.0中限定在服务器中输入密码次数,直接vim /etc/pam.d/system-auth中添加以下三条即可,无须在 /etc/pam.d/password-auth中添加了。
ps:顺序不能乱
auth required pam_faillock.so preauth silent audit deny=3 even_deny_root root unlock_time=30
auth [default=die] pam_faillock.so authfail audit deny=3 unlock_time=30
account required pam_faillock.so
如下:
设置Linux用户连续N次输入错误密码进行登陆时,自动锁定X分钟
限定普通用户的权限
在前面限定了只能使用普通用户登陆,然后切换为root用户,如果普通用户也被他人拿到了,那么也能对系统造成很大的危害,为了解决这问题,必须要限制普通用户的权限;
限定权限,可以往两个方向入手:
第一个:
从文件的角度限制其权限;
我一开始的想法就是让该用户只能在指定的目录中进行操作,其它的目录都不能进入。基于这个考虑,我想到使用ACL文件控制来实现:
使用setfacl限制其对文件的访问,将重要的文件都设置为该用户不能进入,像在根目录下的文件,都是很重要的,有一些文件普通用户可以更改,可运行,这样有很大的隐患:
ps:
对于一个文件:
创建需要写和可执行权限;
读取需要读和可执行权限;
进入文件需要可执行权限。
来源:Linux进入目录、创建文件、显示文件分别需要什么权限?
例如:
设置用户test,不能修改,不能进入,不可读etc目录,使用如下语句:
setfacl -Rm u:test:--- /etc
这样的确可以实现该普通用户对文件的访问权限,但是随之而来的就是很麻烦。。。。这么多文件一个一个设置,真的麻烦。。。。。
其实除了这个方法之外,还有一个方法,也可以实现限制其对文件的访问,那就是使用chroot监狱限制其用户访问指定目录,具体参考:
使用 chroot 监狱限制 SSH 用户访问指定目录
上面博客的原出处:
linux中国,使用 chroot 监狱限制 SSH 用户访问指定目录
但是使用chroot监狱还是挺麻烦的。。。。我还是不想使用。。。
对于ACL具体,请参考:
第5章 用户身份与文件权限
第二个:
从命令的角度限制其权限;
因为从文件的角度实现对普通用户的限制,很麻烦,所以我决定另辟蹊径。之后想到,为什么不可以限制其用户使用的命令呢?当用户只能使用特定命令的时候,这样不就连去访问其它文件也不可能了嘛?
明显这个角度更加安全些。因为难免会有一些目录没有被考虑到,并且还可以使用sudo命令让这个普通用户提权,这样就很不安全!
但是很多命令不赋予其用户,那么该用户是无法胡作非为的;所以我就着手查资料,然后就搜索到可以使用Restricted Shell来限制其能够使用的命令。
具体操作:
条件就是:在root权限下。
首先,从Bash 创建一个名为rbash的软连接,如下:
ln -s /bin/bash /bin/rbash
然后创建一个用户,设置密码并且之外;
指定其shell为前面创建的shell的rbash:
useradd lisi -s /bin/rbash
之后linux会在/home 下自动创建lisi的home目录;然后我们需要在该home目录下创建bin文件夹,这个bin文件夹,就是命令文件夹,如下:
这样我们就可以指定该用户可以运行什么样的命令了,创建属于某个命令的软连接,例如创建ls、mkdir的软连接,如下:
ln -s /bin/ls /home/lisi/bin/ls
ln -s /bin/mkdir /home/lisi/bin/mkdir
ps:
查看命令路径使用whereis命令,例如whereis ll
接下来,阻止用户修改.bash_profile。
chown root /home/lisi/.bash_profile
chmod 755 /home/lisi/.bash_profile
最后修改PATH环境变量的配置文件。
编辑/home/lisi/.bash_profile文件;将PATH改为的值变更为:PATH=$HOME/bin
然后wq保存!!!
这样当使用lisi用户登录的时候,只能够使用ll和mkdir命令,其它命令都不能使用,如下:
感谢文章:
如何使用rbash限制用户访问Linux系统指定命令
这最后一步作用:
现在,当用户登录时,受限shell(rbash)将作为默认登录shell运行并读取.bash_profile,它将PATH设置为$ HOME / bin,以便用户只能运行ls,mkdir命令。受限制的shell将不允许用户更改PATH,并且.bash_profile上的权限将不允许用户在下次登录会话期间更改环境以绕过限制。
除此之外还会对其限制:
什么是Restricted Shell?
首先,让我澄清一下Restricted Shell究竟是什么。它不是像Bash,KornShell等单独的shell。如果使用“rbash”,“ - restricted”,“ - r”选项启动任何现有的shell,那么它将成为Restricted shell。例如,Bourne shell可以使用命令bsh-r作为受限shell启动,使用命令ksh -r启动Korn shell 。
Restricted Shell将限制用户执行大多数命令和更改当前工作目录。Restricted Shell将对用户施加以下限制。
它不允许您执行cd命令。所以你不能去任何地方。您可以简单地留在当前的工作目录中。
它不允许您修改 $ PATH,$ SHELL,$ BASH_ENV或$ ENV环境变量的值。
它不允许您执行包含/(斜杠)字符的程序。例如,您无法运行/ usr / bin /uname或./uname命令。
但是,您可以执行uname命令。换句话说,您只能在当前路径中运行命令。 您无法使用’重定向输出’>’,’>|’,’<>’,’>&’,’&>’,‘和’>>'重定向运算符。
它不允许您在脚本中退出受限制的shell模式。 它不允许您使用’
set + r’或’set + o restricted’关闭受限制的shell模式。
安全组
阿里云的安全组,其规则的配置,入的方向,配置为指定的ip地址进行访问,特别是像telent,ssh,ftp的端口全部都只允许指定ip地址接收数据,如下:
防火墙
在CentOS中,7.0及以上使用的是firewalld,而7.0版本之前使用的是iptables。
对于防火墙的设置,很多端口需要设定指定ip地址才能够访问服务,这样防止黑客登录;
iptables
两种服务只能选其一,不能都选择,所以使用iptables的时候,先查看firewalld是否存在,如果存在的话,查看firewalld的状态,如下:
systemctl status firewalld
显示绿色的active说明是运行的,否则没有运行;运行的需要关闭,自启动也需要关闭:
systemctl enable firewalld 自启动关闭
service firewalld stop 关闭
设置iptables之前,同样需要查看该服务是否存在:
rpm -qa | grep iptables
如果存在是有iptables显示,否则没有;
没有需要安装:
yum install iptables-services
安装之后查看iptables状态:
service iptables status
显示有一些端口和ip则说明是开启的;否则会提示Firewall is not running.
作为一个服务器其端口的开启要严格限制,所以先关闭所有的流入端口:
iptables -P INPUT DROP
并且对于流出的端口,和转发端口也需要考虑预设的策略;像流出就直接设置通过,转发的话也需要关闭,如下:
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
指定22端口被ip192.168.0.3访问
iptables -A INPUT -s 192.168.0.3 -p tcp --dport 22 -j ACCEPT
设置好之后,需要保存!!!!不然只是在内存中!
service iptables save
需要重启才能生效,顺便设置开机自启动:
service iptables restart
chkconfig iptables on
之后查看防火墙的规则,就可以看到,如下:
其它端口的添加跟上面的是一样的,因人而异了。
上面感谢一下博主的分享:
通过命令设置的iptables规则重启失效问题
对于iptables的设置,除了使用单条命令之外,还可以直接配置iptables的配置文件/etc/sysconfig/iptables;
具体参考文章:
CentOS 7.0关闭默认防火墙启用iptables防火墙
firewall
跟iptables一样的,也需要查看firewall的状态:
systemctl status firewalld
显示为绿色则为开启的状态;否则未开启;如果未开启的话,则需要开启,并且顺便设置开机自启动,如下:
#开启防火墙
systemctl start firewalld
#开机启动
systemctl enable firewalld
查看已有的端口:
firewall-cmd --list-all
如果要设定的端口已经开启了,那么需要先删除,删除端口:
firewall-cmd --zone=public --remove-port=8080/tcp --permanent
删除之后,重启firewalld看是否生效,如下:
firewall-cmd --reload
然后在查看打开的端口,看是否还有:
#系统打开的所有端口
firewall-cmd --zone=public --list-ports
没有了再添加想要指定ip地址的端口,如下:
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.0.3" port protocol="tcp" port="22" accept"
之后老规矩,还是需要重启,如下:
#重新载入一下防火墙设置,使设置生效
firewall-cmd --reload
最后查看自己设置的端口是否已在打开端口中,如下:
firewall-cmd --list-all
或者使用这个:
#查看已设置规则
firewall-cmd --zone=public --list-rich-rules
跟iptables一样,也可以通过直接设置vim /etc/firewalld/zones/public.xml配置文件来实现。具体参考博客:
firewalld配置只允许指定IP地址访问
Centos7 firewalld规则配置 | 仅容许指定IP访问
linux服务器登陆邮件提醒
基础
作为一名小白,弄了大半天才弄明白,在linux中mail,mailx和sendmail,postfix是拿来干什么的。。。。
在了解上面的是干嘛的之前,需要解释邮件发送的几个名词:
邮件用户代理(MUA,Mail User Agent)
邮件传送代理(MTA,Mail Transport Agent)
邮件分发代理(MDA,Mail Deliver Agent)
简略的流程是:
由mua编写邮件,mta传输出去,然后交给mda分发给收件的邮箱;
然后这样我们就可以解释下前面提到的几个名词的意思:
mail,mailx ——》mua,也就是拿来编写邮件的;
sendmail,postfix——》mta+mda,也就是邮件服务器,传输和分发都得靠它!
因而言,很多linux系统都是默认安装有邮件服务器和发送邮件的mail的,至于mailx是mail的加强版;
以上邮件的内容更加详细请参考:
SendMail总结
方式
而要想实现linux服务器登录邮件提醒,常见的就是两种方式实现:
第一种:
自己搭建一个邮箱服务器进行收发邮件,可以使用sendmail或者postfix等等。。。这样就可以直接实现收发邮件的功能;
请参考:
postfix:
linux中搭建邮件服务器,使用postfix和dovecot
linux中搭建邮件服务器,使用postfix和dovecot二
Linux系统下邮件服务器的搭建(Postfix+Dovecot)
sendmail:
Linux系统sendmail发送邮件
第二种:
跟第一种不同之处在于:
第二种使用的是第三方的邮箱服务器来实现mta和mda功能,也就是发邮件和收邮件的。
请参考:
postfix:
linux配置邮件告警服务
sendmail:
【CentOS】 Linux 7.4.1708 (Core)系统远程登陆服务器时发送邮件提醒
实现
在前面的两种方式中,我选择了第二种方式。使用第二种方式的好处是对于服务器而言,不用浪费额外的资源,而且很重要的一点是第二种方式更加方便!自己搭建一个邮箱服务器的话,需要配置蛮多东西的。总之选择第二种。
在前面的第二种方式参考的博文里面,看了许多遍。很多博文都或多或少有缺陷。。。最主要的是很多都不告诉你为啥这样做。。。。唉,对于我这种小白而言也太不友好了!
下面是我一步一步尝试出来的。
选择第二种方式,虽然我们不需要mta和mda,但是我们仍然需要mua,即写邮件的东西;所以可以下载mail或者mailx;我的是一开始就有mailx的,一般来说默认是安装有mail的。使用rpm -qa|grep mail查看是否有。。没有使用 yum install -y mailx命令下载。
下面是我的验证:
根据这篇Linux安装mailx配置SMTP发送邮件博文可以知道,默认情况是使用sendmail进行发邮件的,但是我没有,也没有安装,所以就需要配置mailx,使用第三方来发邮件。
修改配置文件
vi /etc/mail.rc,在最后面添加如下:
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/
set from=139@qq.com
set smtp=smtps://smtp.qq.com:465
set smtp-auth-user=139@qq.com
set smtp-auth-password=jtpccccci
set smtp-auth=login
set from:设置发件人
set smtp:设置外部STMP服务器
set smtp-auth-user:设置STMP用户名(就是收件人)
set smtp-auth-password:设置SMTP密码,qq是授权码
set nss-config-dir:指定本地证书路径
set smtp=smtps://smtp.zoho.com:465 设置SMTP地址及端口,注意smtps说明启用了SSL加密
set ssl-verify:忽略证书错误
授权码的获取在qq邮箱官网中,并且必须开启第三部分的红方框所圈的服务,如下:
除了授权码需要获取,还需要获取本地证书。因为使用ssl即加密的方式传递邮件的话,需要制定其本地的证书set nss-config-dir。所以我么需要找到本地证书在哪里,使用如下语句查看:
find / -name "cert*.db"
所以我设置的就是证书的路径,如下:
然后我根据百度回答的内容晓得了,使用两个命令:
who和whoami。前者获取登录的信息包括ip,后者获取到到登录的用户名。
接下来还有两个地方需要注意:
第一个是云服务器,比如阿里云需要在安全组中配置好stmps的出端口,即465。注意本来使用的是25,但是25端口是明文传输,且阿里云禁用,所以使用465;
第二个无论是不是云服务器,都要配置防火墙策略,需要开放这个465端口。
然后就可以测试一下使用mail命令:
echo "测试" | mailx -s "服务器登陆提醒" 你的邮箱名@qq.com
要是再crt不能显示中文,请参考:阿里云 ECS Linux 服务器中文乱码如何解决?
qq邮箱应该很快就能收到的。可以收到的话才能进行下一步,不行的话。。。请参考:
Linux使用第三方SMTP服务发送邮件连接服务器失败解决办法
如果能够收到,那么我们就要设计登录后自动发邮件给我们的QQ邮箱或者其它邮箱了。
其实有很多方式可以实现,比如linux中用户登录后会运行的配置文件目录中,然后在目录中写一个发送邮件命令的文件,有个博文可以参考:
linux系统登录久提示使用小脚本
还有就是可以在用户登录后会扫描的配置文件中直接写发送邮件的语句,也可以实现,我采用的就是这个方式。针对不同用户,有不同的配置文件,可以参考:
教你如何在 Linux 上为 SSH 登录设置电子邮件提醒
我自己设置的是在root用户登录提醒邮件,毕竟root很重要。然后是将语句写在shell的配置文件中。
进入/etc 目录,然后运行以下命令 :
vim ~/.bash_profile
写入以下语句:
who=`who`
whoami=`whoami`
echo -e "有人登录云服务器,登录人: $whoami \n 登录信息: $who " | mailx -v -s "服务器登陆提醒" 13@qq.com
这就是我前面提到的,学到两个命令的作用。注意who=`who`
这个不是引号,是~键的英文
然后退出,再root登录,就可以查看到信息了~~~