SSH端口转发
SSH会自动的加密和解密所有SSH客户端与服务器之间的网络数据;同时也可以将其他TCP端口的数据加密转发,这一过程叫“隧道”,这样也可以减少防火墙开启的端口。
实现过程是数据首先通过连接本机的某一个端口,被当做ssh协议数据发送给ssh服务器,ssh服务器解密再发给远程主机的端口
本地转发:
-L localport:remotehost:remotehostport sshserver
locaolport本机端口号、远程主机地址和端口、ssh协议的端口–23端口或25端口
选项:
-f 后台启用
-N 不打开远程shell,处于等待状态(一般搭配f,实现在当前窗口就可传输数据,不需要开新窗口)
-g 启用网关功能
示例
ssh –L 9527:telnetsrv:23 sshsrv
telnet 127.0.0.1 (也可接端口,即指定连接端口)
远程转发:
-R sshserverport:remotehost:remotehostport sshserver
示例:
ssh –R 9527:telnetsrv:23 –N sshsrv
让sshsrv侦听9527端口的访问,如有访问,就加密后通过ssh服务转发请求到本机ssh客户端,再由本机解密后转发到telnetsrv:23(Data←→sshsrv:9527←→sshsrv:22←→localhost:XXXXX←→localhost:YYYYY←→telnetsrv:23)
还有一种是动态端口转发。
ssh服务器
服务器端:sshd, 配置文件: /etc/ssh/sshd_config
常用参数:
ØPort 端口
ØListenAddress ip
ØLoginGraceTime 2m 登录等待时间
ØPermitRootLogin yes是否允许root登录
ØStrictModes yes 检查.ssh/文件的所有者,权限等
ØMaxAuthTries 6最多的验证密码的次数(生效一半)
ØMaxSessions 10 同一个连接最大会话(同一个会话→克隆)
ØPubkeyAuthentication yes 是否支持基于key验证登录
ØPermitEmptyPasswords no
ØPasswordAuthentication yes 是否基于密码验证登录
ClientAliveInterval 60 用户没有操作是最多等待n秒
ClientAliveCountMax 等待结束提醒次数最多为多少后,就退出ssh服务连接
UseDNS yes 改为no可提升访问速度
GSSAPIAuthentication yes 提高速度可改为no
MaxStartups 未认证连接最大值,默认值10(10:30:100 10个以上的连接后开始70%的成功率连接)
Banner /path/file 可以设置提示界面的提示语
限制可登录用户的办法:(直接在配置文件中添加即可生效)
AllowUsers user1 user2 user3
DenyUsers
AllowGroups
DenyGroups
ssh服务的最佳实践
u建议使用非默认端口
u禁止使用protocol version 1
u限制可登录用户
u设定空闲会话超时时长
u利用防火墙设置ssh访问策略
u仅监听特定的IP地址
u基于口令认证时,使用强密码策略
tr -dc A-Za-z0-9_ < /dev/urandom | head -c 30| xargs
u使用基于密钥的认证
u禁止使用空密码
u禁止root用户直接登录
u限制ssh的访问频度和并发在线数
u经常分析日志(last查看日志信息或lastb查看失败登录的信息;在/var/log/下,btmp是失败登录的日志)
编译安装dropbear示例
ssh协议的另一种实现方式:dropbear
开始:
- 确保已安装开发包组yum groupinstall “Development tools”
- 下载dropbear最新的安装包
- tar
- 了解README等帮助文件
- 分配配置文件等文件的各个安装路径:./configure –prefix=/data/dropbear –sysconfdir=/etc/dropbear/
- 上一步缺什么依赖包就安装什么包,以确保上一步正确完整安装
- 开始编译(若是能力允许,其实可以自选)make PROGRAMS=”dropbear dbclient dropbearkey dropbearconvert scp”
- make install 和ls /data/dropbear/ 等查看是否完成;/etc/dropbear/文件夹若是没有,手动创建即可
- 在/etc/profile.d/dropbear.sh设置path变量,并且进行生效操作
- 根据帮助文档中的提示,生成必要的key在/etc/dropbear/中:dropbearkey -t rsa -f /etc/dropbear/dropbear_rsa_host_key -s 2048
- 然后即可登录,第一次最好在前台测试:dropbear -p :2222 -F –E #前台运行
- 客户端访问:dbclient -p 2222 root@127.0.0.1
AIDE
是一个入侵检测工具,主要用途是检查文件的完整性,审计计算机上的那些文件被更改过了
操作:
初始化默认的AIDE的库:
/usr/local/bin/aide –init
生成检查数据库(建议初始数据库存放到安全的地方)
cd /var/lib/aide
mv aide.db.new.gz aide.db.gz
检测: /usr/local/bin/aide –check
更新数据库
aide –update
sudo
sudo能够授权指定用户在指定主机上运行某些命令。如果未授权用户尝试使用 sudo,会提示联系管理员
sudo也可以记录日志;使用时间戳文件默认每隔五分钟检测一次权限
添加权限要写入文件:/etc/sudoers
最好写一个单独的文件放入:/etc/sudoers.d/
visudo可直接添加附加权限,虽然有检查语法功能,但不是彩色的,需修改配置文件:(记得生效)
echo export EDITOR=vim >> /etc/profile.d/env.sh
时间戳文件:/var/db/sudo
日志文件:/var/log/secure
配置文件支持使用通配符glob:
?:任意单一字符
* :匹配任意长度字符
[wxc]:匹配其中一个字符
[!wxc]:除了这三个字符的其它字符
\x : 转义
[[alpha]] :字母 示例: /bin/ls [[alpha]]*
授权规则格式:
用户 登入主机=(代表用户) 命令
示例:
root ALL=(ALL) ALL
格式说明:
user: 运行命令者的身份
host: 通过哪些主机
(runas):以哪个用户的身份
command: 运行哪些命令
sudo -u wang ….指定具备谁的权限来进行操作
支持别名识别:
Users和runas:
username
#uid
%group_name
%#gid
user_alias|runas_alias
host:
ip或hostname
network(/netmask)
host_alias
command:
command name
directory
sudoedit
Cmnd_Alias
别名有四种类型:User_Alias, Runas_Alias, Host_Alias ,Cmnd_Alias
别名格式:[A-Z]([A-Z][0-9]_)*
别名定义:
Alias_Type NAME1 = item1, item2, item3 : NAME2 = item4, item5
示例1:
student ALL=(root) /sbin/pidof,/sbin/ifconfig
%wheel ALL=(ALL) NOPASSWD: ALL (后面是表示不需要输入密码即可操作)
示例2:
User_Alias NETADMIN= netuser1,netuser2
Cmnd_Alias NETCMD = /usr/sbin/ip
NETADMIN ALL=(root) NETCMD
示例3:(设置默认sudo所要代表的用户)
Defaults:wang runas_default=tom
wang ALL=(tom,jerry) ALL
sudo命令的其他选项:
-V 显示版本信息等配置信息
-u user 默认为root
-l,ll 列出用户在主机上可用的和被禁止的命令
-v 再延长密码有效期限5分钟,更新时间戳
-k 清除时间戳(1970-01-01),下次需要重新输密码
-K 与-k类似,还要删除时间戳文件
-b 在后台执行指令
-p 改变询问密码的提示符号
示例:-p ”password on %h for user %p:”
TCP_Wrappers
主要解决对TCP的安全控制
某进程是否接受libwrap的控制取决于发起此进程的程序在编译时是否调用该库
判断服务程序是否能够由tcp_wrapper进行访问控制的方法:
ldd /PATH/TO/PROGRAM|grep libwrap.so
strings PATH/TO/PROGRAM|grep libwrap.so
配置文件:/etc/hosts.allow, /etc/hosts.deny
帮助参考:man 5 hosts_access,man 5 hosts_options
检查顺序:hosts.allow,hosts.deny(默认允许)
注意:一旦前面规则匹配,直接生效,将不再继续
基本语法:
Ø daemon_list@hostip: client_list [ :options :option… ]
Daemon_list@host格式
- 单个应用程序的二进制文件名,而非服务名,例如vsftpd
- 以逗号或空格分隔的应用程序文件名列表,如:sshd,vsftpd
- ALL表示所有接受tcp_wrapper控制的服务程序
- 主机有多个IP,可用@hostIP来实现控制
如:in.telnetd@192.168.0.254
客户端Client_list格式
- 以逗号或空格分隔的客户端列表
- 基于IP地址:168.10.1 192.168.1.
- 基于主机名:magedu.com .magedu.com 较少用
- 基于网络/掩码:168.0.0/255.255.255.0
- 基于net/prefixlen: 192.168.1.0/24(CentOS7)
- 基于网络组(NIS 域):@mynetwork
- 内置ACL:ALL,LOCAL,KNOWN,UNKNOWN,PARANOID
[:options]选项:
帮助:man 5 hosts_options
deny 主要用在/etc/hosts.allow定义“拒绝”规则
如:vsftpd: 172.16. :deny
allow 主要用在/etc/hosts.deny定义“允许”规则
如:vsftpd:172.16. :allow
spawn 启动一个外部程序完成执行的操作
twist 实际动作是拒绝访问,使用指定的操作替换当前服务,标准I/O和ERROR发送到客户端,默认至/dev/null
测试工具:
tcpdmatch [-d] daemon[@host] client
-d 测试当前目录下的hosts.allow和hosts.deny
示例:
- sshd: ALL :spawn echo “$(date +%%F) login attempt from %c to %s,%d” >>/var/log/sshd.log
说明:
Ø在/etc/hosts.allow中添加,允许登录,并记录日志
Ø在/etc/hosts.deny中添加,拒绝登录,并记录日志
Ø%c 客户端信息
Ø%s 服务器端信息
Ø%d 服务名
Ø%p 守护进程的PID
Ø%% 表示%
- vsftpd: 172.16. :twist /bin/echo “connection prohibited”
PAM认证机制
PAM相关文件
Ø模块文件目录:/lib64/security/*.so
Ø环境相关的设置:/etc/security/
Ø主配置文件:/etc/pam.conf,默认不存在
Ø为每种应用模块提供一个专用的配置文件:/etc/pam.d/APP_NAME
Ø 注意:如/etc/pam.d存在,/etc/pam.conf将失效
pam认证原理
uPAM认证一般遵循这样的顺序:Service(服务)→PAM(配置文件)→pam_*.so
uPAM认证首先要确定那一项服务,然后加载相应的PAM的配置文件(位于/etc/pam.d下),最后调用认证文件(位于/lib/security下)进行安全认证
通用配置文件/etc/pam.conf格式
application type control module-path arguments
专用配置文件/etc/pam.d/* 格式
type control module-path arguments
说明:
模块类型(module-type)
control PAM库该如何处理与该服务相关的PAM模块的成功或失败情况
module-path 用来指明本模块对应的程序文件的路径名
Arguments 用来传递给该模块的参数
模块类型(module-type)
- Auth 账号的认证和授权
- Account 与账号管理相关的非认证类的功能,如:用来限制/允许用户对某个服务的访问时间,当前有效的系统资源(最多可以有多少个用户),限制用户的位置(例如:root用户只能从控制台登录)
- Password 用户修改密码时密码复杂度检查机制等功能
- Session 用户获取到服务之前或使用服务完成之后需要进行一些附加的操作,如:记录打开/关闭数据的信息,监视目录等
- -type 表示因为缺失而不能加载的模块将不记录到系统日志,对于那些不总是安装在系统上的模块有用
Control控制:
PAM库如何处理与该服务相关的PAM模块成功或失败情况
两种方式实现:
简单和复杂
简单方式实现:一个关健词实现
- required :一票否决,表示本模块必须返回成功才能通过认证,但是如果该模块返回失败,失败结果也不会立即通知用户,而是要等到同一type中的所有模块全部执行完毕再将失败结果返回给应用程序。即为必要条件
- requisite :一票否决,该模块必须返回成功才能通过认证,但是一旦该模块返回失败,将不再执行同一type内的任何模块,而是直接将控制权返回给应用程序。是一个必要条件
- sufficient :一票通过,表明本模块返回成功则通过身份认证的要求,不必再执行同一type内的其它模块,但如果本模块返回失败可忽略,即为充分条件
- optional :表明本模块是可选的,它的成功与否不会对身份认证起关键作用,其返回值一般被忽略
- include: 调用其他的配置文件中定义的配置信息
复杂详细实现:使用一个或多个“status=action”
[status1=action1 status2=action …]
Status:检查结果的返回状态
Action:采取行为 ok,done,die,bad,ignore,reset
- ok 模块通过,继续检查
- done 模块通过,返回最后结果给应用
- bad 结果失败,继续检查
- die 结果失败,返回失败结果给应用
- ignore 结果忽略,不影响最后结果
- reset 忽略已经得到的结果
module-path: 模块路径
- 相对路径:
/lib64/security目录下的模块可使用相对路径
如:pam_shells.so、pam_limits.so
- 绝对路径:
模块通过读取配置文件完成用户对系统资源的使用控制
/etc/security/*.conf
注意:修改PAM配置文件将马上生效
建议:编辑pam规则时,保持至少打开一个root会话,以防止root身份验证错误
ss -ntl 可查到现已开启的端口号
ss -nt 可查现在登录的客户端
本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/99641