SSH服务
本质是实现安全的远程管理,基于DH算法做密钥交换,基于RSA或DSA实现身份验证
CentOS系统默认使用的是openssh软件安装ssh服务
socket:套接字 用来标识应用的唯一地址
SSH—Client
配置文件 /etc/ssh/ssh_config
选项:StrictHostKeyChecking no 可在首次登录时不显示检查信息
客户端命令格式
ssh [USER@]IP_SERVER [CMD] 或者ssh [-l USER] IP_SERVER [CMD]
若服务器的ssh端口号变化,则需要增加“-p PORT”选项,或者是在配置文件 /etc/ssh/ssh_config中,将端口号改为相同
客户端会记录连接过的服务器IP信息,存放在 /root/.ssh/known_host 文件中(普通用户是在家目录下)
SSH服务安全实现原理
用户远程连接ssh服务器时,会复制ssh服务器/etc/ssh/ssh_host*key.pub(CentOS7默认是ssh_host_ecdsa_key.pub)文件中的公钥到客户机的 “家目录下/.ssh/know_hosts”中,下次连接时,会自动匹配相应私钥,不能匹配,将拒绝连接
SSH服务登录验证基于key验证,指定主机指定用户不需要输入目标主机口令
假设A基于key验证去登录B
第一步:A生成公、私钥对
ssh-keygen [-t 加密算法] [-P‘口令’] [-f 路径]
(需要注意的是不同的加密算法对应生成的公私钥文件名不同,默认为rsa算法)
默认存放路径:
私钥:“家目录下/.ssh/id_rsa”文件中
公钥:“家目录下/.ssh/id_rsa.pub”文件中
第二步:A将生成的公钥文件传给B的用户家目录
ssh-copy-id -i “公钥文件” IP_SERVER
此时B在“家目录下/.ssh/”目录下,会生成authorized_keys
若想要修改密钥口令,使用如下命令:
ssh-keygen -p -f 家目录下/.ssh/id_rsa
在密钥有口令时,为了不想在连接远程服务端时输入密钥口令,可进行代理:在本主机上执行如下命令:
1.ssh-agent bash
2.ssh-add
基于ssh服务传输文件的一些命令:
scp [options] FILE USER@IP:目标路径
常用options:
-r 拷贝目录递归文件
-p 保留原文件属性
-P PORT 指明远程主机监听端口
rsync只复制不同文件
rsync [options] /Dir USER@IP:目标路径 表示将目录和目录下文件都拷贝
rsync [options] /Dir/ USER@IP:目标路径 表示只对目录下文件拷贝
常用options:
-r 拷贝目录递归文件
-v 显示详细过程
-a 存档,相当于–rlptgoD,但不保留ACL(-A)和SELinux属性(-X)
SSH端口转发:
下列情况基于假设B、C在同一公司内,A处于外部,公司对外设置防火墙
本地转发:(访问固定服务端)
A:client B:ssh-server C:各类服务器
假设C此时为Telnet服务器,A要对C进行访问
A执行如下命令:
1.ssh -L PORT:IP_C:23 IP_B
A通过SSH加密转发连接至B上,建立桥梁,加上选项“-Nf”可后台启用
2.telnet 127.0.0.1 PORT
可以输入C里普通用户名和密码登录上去(此时C上显示的是B为telnet连接者)
(PORT是A上没有使用的端口号,23是Telnet服务的端口号)
此时数据的传输方式则是如下:
Data <—> A的PORT <--> A的随机端口 <--> B的22端口 <--> B的随机端口 <--> C的23端口
远程转发:(访问固定服务端)
A:远程主机 B:client C:各类服务器
假设C此时为telnet-server,A要对C进行访问
B执行如下命令:
ssh -R PORT: IP_C:23 IP_A
B通过SSH加密转发连接至A,建立桥梁
(port是A上没有使用的端口号,23是Telnet服务的端口号)
A执行如下命令:
telnet 127.0.0.1 PORT
则可以输入C里普通用户名和密码登录上去(此时C上显示的B为telnet连接者)
此时数据的传输方式则是如下:
Data <—> A的PORT <--> A的22端口<--> B的随机端口1 <--> B的随机端口2 <--> C的23端口
翻墙实验(SSH动态端口转发)(通过代理服务器访问外网)
X:Client Y:Proxy Z:Internet
Client上执行:
1. X通过SSH加密转发,与Y建立桥梁
ssh -D PORT USER@IP_Y
(PORT是Client上没有使用的端口号)
2.设置代理
a.命令行方式:curl --socks5 127.0.0.1:PORT IP_Z
b.还可以使用图形化界面:
进入虚拟机自带firefox浏览器
设置选项中选择“advanced”中的“network”
对connection进行设置
在socks中输入127.0.0.1以及PORT并选择sock v5版
延伸:
若在X 上执行
ssh -gD PORT IP_Y
则其他的一些客户端,通过设定X的IP为socket,指定PORT ,也可以连接Z
SSH-Server配置
配置文件 /etc/ssh/sshd_config
常用选项:
默认值 建议值
Port 22 建议修改为其他端口
ListenAddress 0.0.0.0 可修改为指定IP
UseDNS yes 修改为no提高远程连接速度
GSSAPIAuthentication yes 修改为no提高远程连接速度
ClientAliveInterval 非活动连接时间,可指定时间
ClientAliveCountMax 设定非活动连接时间发生次数,超过次数自动断开
Banner none 可增加FILE路径,开启后,ssh连接时会显示FILE里的内容
还有一些可增加选项:
AllowUsers USER_NAME 只允许指定用户连接
AllowGroups GROUP_NAME 只允许指定组连接
Dropbear也是一款可以提供ssh协议的软件,需要编译安装
客户端工具
dbclient -p PORT USER@IP 通过服务端指定端口连接
服务端启动服务:
dropbearkey -t rsa -f /PATH/dropbear_rsa_host_key (启动服务前需要生成指定的key文件,放置在编译指定的配置文件下)
dropbear -p PORT 后台运行(加上“-F -E”选项,可前台运行)
AIDE 入侵检测工具,有对应软件包aide
若需要对一些指定文件进行监控,可在配置文件/etc/aide.conf中,定义相关监控规则,然后执行如下操作来查看文件的变化信息:
1.aide --init
初始化默认的AIDE的库,将自定义的监控的文件初始属性信息存放在数据库中,在/var/lib/aide/目录下,名称为aide.db.new.gz
2.若需要进行检测查看,则需要:
修改库文件名为:aide.db. gz
执行命令:aide --check
在检测结束后,想要更新数据库,则可以执行如下命令:
aide --init或者aide --update
SUDO
程序包是sudo,主要作用是授权一些指定用户执行一些制定权限的命令,从而实现用户权限委派
配置文件/etc/sudoers 中可设置指定用户执行指定的命令操作
visudo=vi /etc/sudoers 可直接对配置文件进行编辑,并可检查修改的语法
为了便于观察,可通过 “export EDITOR=vim”,使visudo有颜色提示
基本的配置格式:
USER IP_Address=(代表的USER) [NOPASSWD:]COMMAND
表示授权用户在某个指定IP的主机上代表某个用户执行某命令,若是IP_ADDRESS写为 ALL,则表示所有主机
除授权USER外,还可授权指定组“%GROUP”
visudo -c 也可检查配置文件/etc/sudoers的语法
除了直接在主配置文件中修改,还可以在/etc/sudoers.d/目录下创建文件,将授权内容按照标准格式写进去,或者直接使用命令进行创建:
visudo -f /etc/sudoers.d/FILE (为保证安全建议文件权限440)
在授权结束后,被授权用户登入后若是需要执行被授权命令,需要执行如下格式:
sudo -u “代表的USER” COMMAND
(若是代表root,可省略-u选项后续还需要输入自己的密码口令,若在授权时使用NOPASSWD,则不需要)
注意:此时COMMAND必须与被授权时的COMMAND内容完全匹配,包括 / 符号,并且若是此时授权的“COMMAND”是“sudoedit”,则被授权用户也可修改所有授权相关的配置文件
所有的授权用户在执行过授权命令后,会生成以用户名作为文件名的信息文件时间戳存放在/var/db/sudo/lectured/目录下
授权用户也可通过sudo命令的相关选项,查看和定义一些内容:
也可定义如下四种别名进行调用使用:
User_Alias、Host_Alias、Runas_Alias、Cmnd_Alias
需要注意的是定义的别名命名格式必须为:“[A-Z]([A-Z][0-9])*”大写字母加数字,列如NAME1,然后直接调用别名名称即可
TCP_Wrappers工具
工作在OSI模型的第四层的TCP协议中
只有在应用软件调用了 libwrap.so 此函数库,才可以通过TCP_Wrappers实现访问控制
通过在配置文件 /etc/hosts.allow(允许)和 /etc/hosts.deny(拒绝)设置来定义,设置后立即生效,基本格式如下:
Daemon_list@Host_IP:Client_IP1 Client_IP2 [options]………
其中Daemon_list:主机相关连接服务的二进制程序文件名,Host_IP:指定主机服务的端口对应的IP
当两配置文件出现冲突时,/etc/hosts.allow生效
其中options有如下:
举例如下:
表示通过自定义的内容来拒绝访问,并显示
PAM 认证机制(Pluggabale Authentication Modules)
本质是提供平台,将有认证功能的程序通过接口连接使得被认证的软件可以进行调用,通过模块的方式进行调用
PAM模块的存放路径:/lib64/security/*.so
每个模块对应的子配置文件存放在:/etc/security/*.conf (属于全局性)
每个程序也会有单独的针对其所调用的模块的配置文件,存放在:/eic/pam.d/APP_NAME
其中/eic/pam.d/APP_NAME配置文件的基本格式:
TYPE(类型)Control(控制)Module-PATH(调用模块)Argument(参数)
Control的简单实现方式:
(需要注意的是修改PAM配置文件是立即生效的)