为了方便使用,通常服务器都会经过配置远程访问来保证随时配置服务器,可是不正确的远程访问配置会对系统产生安全隐患,产生被入侵的风险。css
现代服务器环境每每须要用户远程登陆,而远程登陆自己就具备必定的安全风险————中间人攻击。
在早期,telnet是一种经常使用的登陆方式,但它过于古老,并且使用明文传输,这使得对其的攻击代价十分之小,极易遭到拦截与伪造。现代远程登陆已经基本抛弃了telnet,而是经过SSH服务远程登陆服务器。
SSH会加密全部的传输数据,而且能够防护DNS和IP欺骗,通过SSH压缩的数据也能够提升远程访问的传输效率。
SSH在服务端运行的是sshd服务,sshd服务对应的主配置文件是/etc/ssh/sshd_config
。shell
不少时候,为了方便记忆,用户每每会使用一些简单的密码。例如本身的生日、某个时间点或者一些其余内容,但这些密码其实安全性很低,在撞库攻击下很容易就受到攻破。因此建议使用随机生成的高位强密码,并周期性更换。
Linux系统自带的openssl就能够生成一串强密码供用户使用,建议使用32位以上的强密码,这样能够有效的防止撞库攻击。
如生成一串十六位的密码:vim
$ openssl rand -base64 16 WjzyDqedkWf3e5A3tJw/c=
使用强密码认证仍存在必定的风险,如管理员忘记或遗失密码,甚至泄露密码。而密钥认证则是一种更加安全的认证方式,由于其将密钥文件存储在客户端与服务器中,没必要输入密码就能够进行登陆,避免了密码泄露的风险。
这里以Xshell6为例,讲解经过密钥认证方式远程登陆Linux服务器的实现方法。安全
$ mkdir /home/user01/.ssh $ chmod 700 /home/user01/.ssh
而后将公钥上传到服务器,而且导入密钥,在将公钥上传后,使用如下命令将公钥导入到服务器,并修改公钥文件的权限:bash
$ ssh-keygen && cat /上传公钥的路径/id_rsa_2048.pub >> /home/user01/.ssh/authorized_keys $ chmod 600 /home/user01/.ssh/authorized_keys
$ vim /etc/ssh/sshd_config ##修改如下配置: Protocol 2 #仅容许使用SSH2 PubkeyAuthentication yes #启用PublicKey认证 AuthorizedKeyFile .ssh/authorized_keys #PublicKey文件路径 PasswordAuthentication no #不使用口令认证
最后重启sshd服务:服务器
$ systemctl restart sshd
用户在shell中的操做记录会被保存在用户目录下的.bash_history
文件中,经过这个文件能够查询shell命令的执行历史,有助于进行系统审计与问题排查。
而且,在遭受到黑客攻击后,也能够经过这个文件查询黑客登陆服务器所执行的历史命令操做,可是黑客在攻击会为了毁灭痕迹而删除.bash_history
文件,因此咱们要对该文件进行保护。
默认的.bash_history并不会区分不一样用户操做命令与执行时间,咱们能够经过如下方式来让history命令记录全部的shell命令的执行时间,编辑/etc/bashrc
文件:app
HISTFILESIZE=4000 #定义保存命令的总数 HISTSIZE=4000 #定义输出的命令总数 HISTTIMEFORMAT='%F %T' #定义时间格式 export HISTTIMEFORMAT #传递变量
而后能够利用如下方法来实现详细记录登录过系统的用户、IP地址、shell命令以及详细操做时间,并将这些信息以文件方式保存在一个安全的目录,
将如下代码添加到/etc/profile文件中:ssh
#history USER_IP='who -u am i 2>/dev/null| awk '{print SNF}'|sed -e 's/[()]//g'' HISTDIR=/usr/share/.history if [ -z $USER_IP ] then USER_IP='hostname' fi if[ ! -d $HISTDIR ] then mkdir -p $HISTDIR chmod 777 $HISTDIR fi if [ ! -d $HISTDIR/${LOGNAME} ] then mkdir -p $HISTDIR/${LOGNAME} chmod 300 $HISTDIR/${LOGNAME} fi export HISTSIZE=4000 DT='date +%Y$m$d_%H%M%S' export HISTFILE="$HISTDIR/${LOGNAME}/${USER_IP}.history.SDT" export HISTTIMEFORMAT="[%Y.%m.%d %H:%M:%S]" chmod 600 $HISTDIR/${LOGNAME}/*.history* 2>/dev/null
tcp_wrappers是Linux中用于分析TCP/IP数据包的软件,相似的如iptables
,与iptables不一样的是,iptables经过监视系统运行状态阻挡恶意攻击。而tcp_wrappers
能够实现对系统中提供某些服务的控制。
tcp_wrappers有一个TCP的守护进程叫做tcpd。以ssh为例,每当有ssh的链接请求时,tcpd即会截获请求,先读取系统管理员所设置的访问控制文件,符合要求,则会把此次链接原封不动的转给真正的ssh进程,由ssh完成后续工做;若是此次链接发起的ip不符合访问控制文件中的设置,则会中断链接请求,拒绝提供ssh服务。tcp
但tcp_wrappers仍存在有必定的局限性,Linux中的一个服务是否可使用tcp_wrappers,取决于服务是否应用了libwrapped库文件,系统中默认的一些服务,如sshd、portmap、sendmail、xinetd、vsftpd、tcpd等均可以使用tcp_wrappers。工具
咱们能够经过如下命令来检查系统中是否安装有tcp_wrappers
:
$ rpm -q tcp_wrappers
若是输出有关tcp_warppers的信息,则说明系统中已经安装了tcp_warppers。
tcp_wrappers有两个配置文件:/etc/hosts.allow
和/etc/hosts.deny
,
Linux对配置文件的执行是顺序的,先读取/etc/hosts.allow
,一旦知足就应用,而抛弃后面的配置,因此能够只设定/etc/hosts.allow
文件,而后在/etc/hosts.deny
中设置为全部计算机都不能登录。
配置文件准从以下语法:
service:host(s) [:action]
其中,
例如:
ALL:ALL EXCEPT 192.168.123.8
表示除192.168.123.8之外的请求都会被容许或拒绝,取决于以上内容写在哪一个配置文件里。
文本 | 做用 |
---|---|
Port 22 | 用来设置sshd监听的接口,建议修改成5位数字以上的陌生数字端口 |
Protocol 2 | 设置使用的SSH协议版本为SSH1或SSH2,SSH1存在漏洞,建议不变 |
ListenAddress 0.0.0.0 | 用于设置sshd服务器绑定的IP地址 |
HostKey /etc/ssh/ssh_host_dsa_key | 用于设置服务器密钥文件的位置 |
KeyRegenerationInterval 1h | 用于设置生成密钥的周期。能够防止入侵者利用盗取的密钥 |
ServerKeyBits 1024 | 用于定义密钥长度 |
SyslogFacility AUTHPRIV | 用于设置在记录来自sshd的消息时,是否给出facility code |
LogLevel INFO | 用于设置log文件的消息级别 |
LoginGraceTime 2m | 若是用户登陆失败,在切断连接前。服务器须要等待的时间。 |
PermitRootLogin no | 是否容许root用户登陆,建议设置为no |
StrictModes yes | 用于设置SSH在接受登录请求以前是否检查用户根目录和rhosts文件的权限和属主。建议设置为yes |
RSAAuthentication no | 设置是否开启RSA密钥认证,只针对SSH1,使用RSA密钥登陆时,须要开启 |
PubkeyAuthentication yes | 设置是否使用公钥验证,使用公钥验证时,须要开启 |
authorizedKeyFile .ssh/authorized_key | 用于设置公钥文件路径,与PubkeyAuthenticatio 配合使用 |
IgnoreUserKnownHosts no | 用于设置SSH在进行RSAAuthentication 安全认证时忽略用户的$HOME/.ssh/known_hosts 文件 |
IgnoreRhosts yes | 用于设置验证时是否使用~/.rhosts 和~/.shosts 文件。 |
PassWordAuthentication yes | 用于设置是否开启密码验证 |
PermitEmptyPasswds no | 用于设置是否容许用空密码登陆系统,必须为no |
ChallengeResponseAuthenthtication no | 禁用s/key 密码 |
UsePAM no | 是否使用PAM认证 |
X11Forwarding yes | 用于设置是否容许X11转发 |
PrintMotd yes | 用于设置是否显示欢迎登陆信息,建议加入警告信息以震慑攻击者 |
PrintLastLog no | 是否显示上次登陆信息 |
Compression yes | 是否压缩命令 |
TCPKeepAlive yes | 是否防止死连接,经过心跳包的方式来进行链接 |
UseDNS no | 是否使用DNS反向解析 |
MaxStartups | 容许几个还没有登录的链接,已创建的链接不算入其中。设置为5个能够防止对服务器进行恶意链接 |
MaxAuthTries 3 | 设置最大失败尝试登录次数,合理设置能够防护撞库攻击 |
AllowUser <用户名> | 指定用户容许经过远程登陆访问,多个用户以空格分隔 |
AllowGroups <组名> | 指定用户组容许经过远程登陆访问,多个用户组以空格分隔 |
DenyUsers <用户名> | 指定用户禁止经过远程登陆访问,多个用户以空格分隔 |
DenyGroups <组名> | 指定用户组禁止经过远程登陆访问,多个用户组以空格分隔 |