非对称公钥加密并且判断是谁发过来的文件;上图加密过程;
首先原文经过A的哈希算法生成摘要 —–>用A的私钥来加密摘要(当B解密时就会得知是谁发的文件,相当于生成数字签名)—————>A在用B的公钥来加密数字签名和原文内容—–>加密成密文的文件发送到B上——->传到B再用其自己的私钥将密文解密成原文和数字签名文件——->数字签名再用A的公钥解密成数字摘要(就可得知谁发的文件了)——–>在对原文进行哈斯算法得出的摘要和解密的摘要对比。如果一致则原文没有被篡改。
生成文件的摘要:(只要文件内容不变则摘要是相同的)
md5sum file (生成文件摘要)
将文件1和文件2等文件生成摘要存放到某一文件中,通过对比摘要来发现文件是否损坏
md5sum file1 file2 > f4.log
md5sum –check f4.log (自动对比现在文件的摘要和以前保存文件的摘要是否一样来判断文件是否损坏)
对称加密
使用同一把密钥,加密和解密一个文件
gpg -c file (加密) (生成一个新的文件 file.gpg)
gpg -o file2 -d file.gpg (解密文件并生成一个自定义的解密文件file2)
非对称加密 (公钥和私钥是一对的。用某一个加密必须用另一个解密)
A使用B的公钥来加密,传送到B,B再用自己的私钥来解密。
7上的文件用6的公钥加密然后传给6,6再用自己的私钥解密案例:
1.在6和7 的主机上生成公钥/私钥对 (在图形界面操作)
gpg –gen-key (最后按o结束)生成的密钥对在默认目录/root/.gnupg/下
2.在6主机上查看生成的公钥
gpg –list-keys
3.在6上生成的公钥导出
gpg -a –export -o lv.pubkey (文件名可以自定义)
4.从6主机上复制公钥文件到7主机上
scp lv.pubkey 192.168.60.4:/ (将导出的公钥文件传送到7 上的/目录下)
5.在7上导入6的公钥
gpg –import /lv.pubkey
gpg –list-keys (查看公钥)
6.在7上用6的公钥加密文件
gpg -e -r lvcheng(6上生成密钥是自定义的名字) file (此时生成file.gpg的文件)
7.将在7上使用6的公钥加密的文件再次传送到6的主机上
scp file.gpg 192.168.60.2:/data/
8. 最后在6上用其私钥解密文件
gpg -o file1 -d file.gpg (file1为解密生成的文件名自定义)
删除公钥和私钥:(需要先删除私钥在删除公钥否则会报警出错)
gpg –delete-keys lvchen (删除公钥)
gpg –delete-secret-keys lvchen(删除私钥)
最后将文件删除/root/.gnupg
CA和证书
PKI: Public Key Infrastructure
签证机构:CA(Certificate Authority)
注册机构:RA
证书吊销列表:CRL
证书存取库
X.509:定义了证书的结构以及认证协议标准
证书获取
1 使用证书授权机构
生成签名请求(csr)
将csr发送给CA
从CA处接收签名 •
2 自签名的证书
自已签发自己的公钥
SSL/TLS 安全协议
TLS协议是从SSL协议发展演变而来的
HTTPS 协议:就是“HTTP 协议”和“SSL/TLS 协议”的组合,对http协议的文本数据进行加密处理后,成为二 进制形式传输
OpenSSL
openssl命令
生成密钥对儿:man genrsa
生成私钥
openssl genrsa -out /PATH/TO/PRIVATEKEY.FILE NUM_BITS
(umask 077; openssl genrsa –out f3.key 2048) (括号需要添加,077为私钥的权限)
对生成的私钥使用des进行对称加密:(umask 077; openssl genrsa –out f3.key –des -des 2048)
在对其进行解密并生成新的私钥文件f4.key:openssl rsa -in f3.key -out f4.key
从私钥中提取出公钥
openssl rsa –in f3.key –pubout –out f5.key.pub
创建CA和申请证书
创建私有CA:
openssl的配置文件:/etc/pki/tls/openssl.cnf
实验案例:把7当作服务器创建CA证书,然后6向7申请CA证数,7在颁发给6证书。
1 首先在7上建立Root CA,需要以下两步操作 (以下格式的填写都根据模板文件/etc/pki/tls/openssl.cnf来写的)
1)在7上生成私钥
(umask 077;openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096 ) (077 设置私钥的权限,生成的私钥路径必须为/etc/pki/CA/private/生成的私钥的文件名也必须为cakey.pem)
此时查看可以发现文件已经生成了
2)自己给自己颁发证书,因为是自己搭建的rootCA
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3650 (输出的路径及文件名也是指定的。3650为指定CA证书的有效期 ,需要填写:国家;省;市;公司名;部门名;网站域名;)
此时在/etc/pki/CA/则生成了cacert.pem的 文件;查看此文件的方法
openssl x509 -in cacert.pem -noout -text (noout为只预览文件的内容并不生成文件)
也可以把此文件发送到windowns里以图形方式来查看:用sz上传到windowns里并将文件的后缀改为.cer
2 在6上(用户或服务器)需要的的操作:(假设申请的证书给某个服务用的,生成的私钥要放在那个服务下的配置文件里)
1)生成私钥
(umask 077;openssl genrsa -out /data/app.key 1024 ) (假设放在/data/目录下,应用为app的程序使用)
2)生成证书申请文件
openssl req -new -key app.key -out app.csr (随后要填写的内容:国家;省;市;公司;部门;那个程序使用的域名;等等)
3)将6的申请文件发给7创建的RootCA证书
scp app.csr 192.168.60.4:/etc/pki/CA (发送的目录可以自定义,但下面颁发证书时要写对路径)
3 在7上CA颁发证书 (需要创建以下两个文件夹,不然会提示报错)
touch /etc/pki/CA/index.txt (此文件是用来记录证书颁发完后的结果,以及证书的编号等等信息,会自动更新 ,其中V代表有效的证书)
echo 01 > /etc/pki/CA/serial (新建01“01为十六进制”的编号到此文件里,01是将来要颁发证书的编号,)
openssl ca -in app.csr -out /etc/pki/CA/ certs/app.crt -days 100 (颁发证书,输出的路径及文件名必须写成这样,100为颁发证书的有效期)
颁发过证书后,/etc/pki/CA/serial里写的将是给下一个证书颁发的 编号应给为02,当前颁发证书的编号已经存放到/etc/pki/CA/serial.d文件里了。
4.最后将颁发证书的文件复制到6的那个程序应用上就可以了。
scp /etc/pki/CA/certs/app.crt 192.168.60.2:/data/
(其中填写的内容有些项要一致,否则颁发证书会失败,index.txt.attr 中将yes改为no同样的申请也可颁发证书)
颁发证书的吊销:
openssl ca -status 01 (查看证书状态v代表正在使用;R代表吊销的证书 01 为证书的编号)
openssl ca -revoke newcerts/01.pem (吊销证书,01为要吊销证书的编号)
吊销的证书要发布到吊销列表里来对外发布。
首先要新建一个文件:touch /etc/pki/CA/crlnumber并且写入一个01的列表编号
openssl ca -gencrl -out crl.pem (之后生成crl.pem的文件为吊销列表)
openssl crl -in crl.pem -noout -text (查看证书吊销列表)
SSH ( 安全的远程登录 )
ssh, 配置文件:/etc/ssh/ssh_config (里面记录着端口号,可以更改)
StrictHostKeyChecking no 首次登录不显示检查提示 (配置文件中的一项)
两种方式的用户登录认证:
基于password
基于key (公钥的免密码登陆)
ssh [-l user] host [COMMAND]
-p port:远程服务器监听的端口
-b:指定连接的源IP ( 当你的网卡上有两个地址是通过那个ip来链接的。可以通过-b来指定)
-v:调试模式
-C:压缩方式
-X: 支持x11转发 (来实现图形功能的转发。例如在6连接到7上无法使用7上的图形工具,只有在本机操作才可打开的图形工具软件,添加—X的选项后就可以在远程实现本机才能打开的图形软件,退出之后使用ssh -X 连接之后就可以使用了)
-Y:支持信任x11转发
ForwardX11Trusted yes
-t: 强制伪tty分配
ssh -t remoteserver1 ssh remoteserver2 (通过跳板机来连接被防火墙阻隔的服务器)
如果需要在服务器上执行一条命令就返回则可以不通过登陆到服务也可以执行,方便快捷。
ssh 192.268.60.2 'cat /etc/centos-release'
当用户远程连接ssh服务器时,会复制ssh服务器/etc/ssh/ssh_host*key.pub (CentOS7默认是ssh_host_ecdsa_key.pub)文件中的公钥到客户机的 ~./ssh/know_hosts中。下次连接时,会自动匹配相应私钥,不能匹配,将拒 绝连接
基于用户和口令登录验证 的详细过程:
1 客户端发起ssh请求,服务器会把自己的公钥发送给用户
2 用户会根据服务器发来的公钥对自己的登陆密码进行加密
3 加密后的信息回传给服务器,服务器用自己的私钥解密自己的公钥加密的密码,如果密码正确,则 用户登录成功
基于key的登录方式的详细的过程:
1 首先在客户端生成一对密钥(ssh-keygen)
2 并将客户端的公钥ssh-copy-id 拷贝到服务端
3 当客户端再次发送一个连接请求,包括ip、用户名
4 服务端得到客户端的请求后,会到authorized_keys中查找,如果有响应的IP 和用户,就会随机生成一个字符串,例如:acdf
5 服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端
6 得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的 字符串发送给服务端
7服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致, 就允许免密码登录
基于key认证的具体操作过程:(客户机到服务器实现免密码的登陆)
每个账号的家目录下有.ssh/ known_hosts 文件记录着远程机器连接本机的公钥。
1 . ssh-keygen -t rsa (基于rsa加密的私钥公钥对)(交互式选项:生成默认路径的文件;私钥文件的口令;)默认路径:/root/.ssh/id_rsa) 或者使用此命令:ssh-keygen :不添加选项。就没有交互式登陆,以及要选择的项目。
2.ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.60.4 (默认将公钥复制到所要登陆主机, 的/root/.ssh/authorized_keys下,如果不用此命令也可以将自己生成的公钥文件改名为authorized_key并复制到/root/.ssh/authorized_keys里面) ssh-cop-id 192.168.60.5 也可以不加公钥文件。自己的公钥文件默认追加到/root/.ssh/authorized_keys里面了
3.再去连接对方则不需要输入密码了。如果要对方连接自己的主机实现免密码登陆,要将自己的公钥复制到对方的文件/root/.ssh/authorized_keys里面即可。
4 . 如果连接其他主机的非root用户;再传送公钥时添加名称即可;例如:lv@192.168.60.4 ,其公钥文件存放在lv 用户的家目录文件下/home/lv/.ssh/,和root的公钥文件存放在不同地方。
多台主机之间普通用户实现免密登录:
多个主机之间都有相同的一个用户lv
在A主机上切换到lv用户然后生成公钥文件:
ssh-keygen
在切换到root用户将lv的公钥文件远程拷贝到B主机lv用户的家目录下:
ssh-copy-id -i /home/lv/.ssh/id_rsa.pub lv@10.200.10.165
(10.200.10.165为B主机的IP地址)
最后在A主机上切换到lv用户就可以实现免密登录到B主机的lv用户了。
ssh lv@10.200.10.165
总结: 在B主机的lv用户的家目录/home/lv/.ssh/authorized_keys 里的公钥信息就是A主机的个人公钥信息在A主机/home/lv/.ssh/id_rsa.pub里的内容。
这种免密登录为单向的免密登录只能是A主机的lv用户免密登录到B主机的lv用户上。
如果A主机为rootB主机为普通用户lv .则只需要将A主机root的公钥文文件追加到B主机lv用户的/home/lv/.ssh/authorized_keys就可以了。
多台主机实现互相免密码登陆:
第一种方法:各自生成公钥,并把各自的公钥文件发送到各个主机上就可以了。(也可以将所有主机的公钥文件(包括自己的公钥文件:执行命令;ssh-copy-id -i +自己的IP地址就可以可)存放到一台主机上然后再发送到其他主机上就可以了);如果不想实现免密码登陆,将文件删掉就可以了。
第二种方法:所有人共用一把钥匙
1 .先再一台机器上生成密钥:ssh-keygen
2 . 将公钥传送到自己的机器上:ssh-copy-id 192.168.60.2 (其中IP地址为本机的地址)
3 .查看/root/.ssh已经生成三个文件了(私钥文件;公钥文件;记录远程机器登陆本机的公钥)
4. 将.ssh下的文件全部复制到其他主机上并保留权限。
scp -pr /root/.ssh 192.168.60.4:/root/
总结:私钥文件如果丢失,则会被别人无密码进入所有主机;所以再生成私钥文件时需要添加密码。(上述操作中为了方便就没有添加,如何添加呢?第一步生成私钥文件时系统会要你设定密码)如果刚才没有添加口令,可以再次添加口令 :ssh-keygen -p
设定了私钥的口令每次登陆又要输入密码了,可以启用代理服务,又不用输入私钥的密码了
具体操作:ssh-agent bash
ssh-add (此两条命令就可以实现私钥密码的代理服务了,代理服务需要每次开机都要执行上述操作一次)
实现多台机器自动化操作
1.生成IP地址的列表文件 ip.txt
2 .vim 生成基于key验证的推送脚本:(使用expect免交换式登陆脚本)
vim ssh_key.sh
ssh-keygen -P "" -f "/root/.ssh/id_rsa" (生成私钥文件" "为空代表私钥的密码没设)
password=511111 (各个主机的登陆密码为已知的并且要相同)
for ip in `cat /data/ip.txt`;do (依次读取ip.txt文件里的每一行,并赋值给变量ip)
expect <<EOF (多行重定向)
spawn ssh-copy-id $ip (将生成的公钥文件传给IP)
expect {
"yes/no" { send "yes\n";exp_continue } (expect捕捉则不需要交互式的输入了)
"password" { send "$password\n" }
}
expect eof
EOF
done
执行脚本后本机就可以免密码登陆ip.txt的里的主机。
scp命令
常用选项:
-C: 压缩数据流
-r: 递归复制
-p: 保持原文件的属性信息
-q: 静默模式
-P PORT: 指明remote host的监听的端口 (如果目标服务器用的端口号不是标准端口号,就需要指定了)
格式:scp /data/f1 lv@192.168.60.4:/data/ (前面为本地文件的路径,lv为远程主机的用户名,不写默认为root用户,后面跟的是要复制到的路径。;也可以复制到远程主机并重名文件,后面只要写上文件的新名称就可以了,如果文件名相同会覆盖其旧文件的内容)
使用scp命令如果要将文件传到其他主机的非root用户则文件只能传到其用户的家目录下,其他路径则没有权限 /home/lv/
rsync命令
比scp更快,只复制不同的文件 (scp命令如果复制过的相同文件再次复制时,还会再复制一遍,而rsync只把不同的文件再次复制,相同的在他的内存中无需再复制一遍就可以把文件快速的复制过来提升效率。)选项:
-n 模拟复制过程
-v 显示详细过程
-r 递归复制目录树
-p 保留权限
-t 保留时间戳
-g 保留组信息
-o 保留所有者信息
-l 将软链接文件本身进行复制(默认)
-L 将软链接文件指向的文件复制
-a 存档,相当于–rlptgoD,但不保留ACL(-A)和SELinux属性(-X)
命令格式与scp命令一样:rsync ip.txt 192.168.60.4:/data/ (默认为root 用户)
pssh工具 (默认没有需要安装)(只能远程操作其他主机,并不能将本机的文件传到其他主机上)
选项如下:
–version:查看版本
-h:存放主机名文件列表;
touch ip.txt (里的内容:192.168.60.4 192.168.60.5 )
pssh -h ip.txt -i 'adduser lv ' (在多台主机上批量创建用户。基础是要实现基于key的验证)
-H:主机字符串,内容格式”[user@]host[:port]” (要连接主机的IP地址)格式
pssh -H 192.168.60.4 -H 192.168.60.5 rm -rf /data/f1
或者写成:pssh -H "192.168.60.4 192.168.60.5" rm -rf /data/f1
-l:登录使用的用户名
-p:并发的线程数【可选】 (如果是100台机器默认是顺序执行的,-p是并发执行,速度快)
-o:输出的文件目录【可选】 (-o /data/ 将执行的结果信息存放到指定的文件下,后续查看)
-e:错误输入文件【可选】
-t:TIMEOUT 超时时间设置,0无限制【可选】
-O:SSH的选项
-v:详细模式
-A:手动输入密码模式 (如果不是基于key的验证需要输入A才行)
-x:额外的命令行参数使用空白符号,引号,反斜线处理
-X:额外的命令行参数,单个参数模式,同-x
-i:每个服务器内部处理信息结果输出到本机界面上
-P:打印出服务器返回信息
Pssh示例
通过pssh批量关闭seLinux :
pssh -H root@192.168.1.10 -i "sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config"
(如果命令里面有""/'' 则外面要添加与里面不同的引号来区分开)
将标准错误和标准正确重定向都保存至/app目录下
pssh -H 192.168.1.10 -o /app -e /app -i "hostname"
PSCP.PSSH命令 :(功能是将本地文件批量复制到远程主机)
选项
-v 显示复制过程
-a 复制过程中保留常规属性
-r 递归复制目录
具体操作示例:
将本地f1 复制到/data/目录
pscp.pssh -H 192.168.1.10 /data/f1 /data/
pscp.pssh -h ip.txt /tata/f1 /data/ (ip.txt文件为远程主机IP的列表)
将本地多个文件批量复制到/data/目录
pscp.pssh -H 192.168.1.10 /root/f1.sh /root/f2.sh /data/
将本地目录批量复制到/data/目录
pscp.pssh -H 192.168.1.10 -r /root/test/ /data
PSLURP.PSSH命令 (功能是将远程主机的文件批量复制到本地 )
-L 指定从远程主机下载到本机的存储的目录,local是下载到本地后的名称
-r 递归复制目录
批量下载目标服务器的passwd文件至/data下,
pslurp -H 192.168.1.10 -L /data/ /etc/passwd passwd/user (passwd/user 远程复制到本机必须指定名称如果用原来的名字则写上原来的名字passwd如果不用则写上新的名字,此项必须要写否则执行失败)
pslurp -h ip.txt -L /data/ /etc/passwd passwd/user (-L 后面跟的是本机要存储的路径)
SSH端口转发
本地转发:(某一服务无法直接连接内网的服务器,通过内网的一台ssh服务器来连接)
选项:
-f 后台启用
-N 不打开远程shell,处于等待状态
-g 启用网关功能
示例
ssh –L 9527:telnetsrv:23 -Nf sshsrv (9527为本机空闲的随机端口,后面跟上要远程连接的服务器地址及端口号;最后跟上中间充当ssh服务的主机IP地址;-Nf选项为后台连接需要重新开个终端了)
当访问本机的9527的端口时,被加密后转发到sshsrv的ssh服务,再解密被转发到 telnetsrv:23
data —–>localhost:9527——-> localhost:XXXXX ——->sshsrv:22 ——->sshsrv:YYYYY —–>telnetsrv:23
案例:有6 ;7;7.5 三台服务器在7.5上设防火墙将6的主机禁止连接(只针对6),然后6主机通过7主机当ssh服务转接到7.5上;具体过程如下:
1.在6和7上查看telnet服务是否开启又或者没用安装此包:
yum intall telnet-server (服务包安装)
yum install telnet (客户端包安装)
systemctl start telnet.socket (启用服务)
ss -ntl 来查看telnet 的23号端口有没有起来
2.将7.5设防火墙阻止6的连接:
iptables -A INPUT -s 192.168.60.2 -j REJECT (IP地址为6主机的地址)
设好之后验证6是否能连接7.5主机:使用ssh连接查看即可;应该是拒绝连接的
3. ssh -L 9527:192.168.60.5:23 192.168.60.4 (9527为6主机的随便不用的端口即可,第一个的IP地址为要连接的7.5的主机的地址,23为要连接主机的telnet服务的端口号,后面的IP地址为当作跳板的7的主机的IP)
4. 此时已经连接到跳板机的界面里,重新开个终端在连接7.5的主机 :此时用ss -ntl 可以产看内部连接的端口号9527已经开启了。
talnet 127.0.0.1 9527 (用此命令就可以连接到7.5上了)
登陆时只能用7.5主机的普通用户登陆; 但登陆之后可以切换到root账号。
详细步骤查看下面博客地址:
https://blog.csdn.net/u011314255/article/details/80401580
远程转发:
示例:
ssh –R 9527:telnetsrv:23 –N sshsrv
让sshsrv侦听9527端口的访问,如有访问,就加密后通过ssh服务转发请求到本 机ssh客户端,再由本机解密后转发到telnetsrv:23
Data ——->sshsrv:9527 ——>sshsrv:22——>localhost:XXXXX ——>localhost:YYY——>telnetsrv:23
动态端口转发:
当用firefox访问internet时,本机的1080端口做为代理服务器,firefox的访问 请求被转发到sshserver上,由sshserver替之访问internet
ssh -D 1080 root@sshserver
在本机firefox设置代理socket proxy:127.0.0.1:1080
curl –socks5 127.0.0.1:1080 http://www.qq.com
sudo
配置文件:/etc/sudoers, /etc/sudoers.d/
授权规则格式: 用户 登入主机=(代表用户) 命令 :root ALL=(ALL) ALL
visudo –c 检查语法 的功能
简单案例:授权lv用户查看/etc/shadow文件的内容
1. 使用visudo 进入配置文件 添加一行 (在root下面的地方添加;使用visudo命令就可以直接打开配置文件了。)
lv 192.168.60.2=(root) /usr/bin/cat /etc/shadow
保存退出后:用命令sudo cat/etc/shadow 就可以查看文件了 ; 默认代表root用户
(192.168.60.2为限定主机;命令必须将其路径写上;里面授权的命名要和外面执行的命令一致,否则无法执行)
组授权
不仅可以授权用户还可以授权组,但要在组名的前面添加% 系统默认%wheel 组有root级别的权限,如果加入到此组当中就相当于有了root的权限了
usermod -aG "wheel" lv (添加进wheel组当中)
gpasswd -d lv wheel (将lv用户移除此组)
不在系统文件上更改;可以在备用的文件上添加某一用户的权限/etc/sudoers.d/
在此文件新建lv文件然后按照上面格式添加其权限也可以。
本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/98732