Linux安全与加密基础(二)

Linux安全与加密基础(二)


  • 常见的加密算法

  • SSL: Openssl与CA认证

  • ssh服务

  • dropbear

  • AIDE

  • sudo


gpg

gpg亦可用于对称加密与文件检验。

文件完整性的两种实施方式

被安装的文件
    MD5单向散列
    rpm --verify package_name (or -V)
发行的软件包文件
    GPG公钥签名
    rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat*
    rpm --checksig pakage_file_name (or -K)

使用gpg实现对称加密

gpg的对称加密算法使用的是 CAST5,

对称加密一个文件

[root@centos7 /testdir]#gpg -c issue 
[root@centos7 /testdir]#ls     # issue.gpg是加密后的文件
issue  issue.gpg

使用gpg -c加密一个文件时,会弹出一个对话框要求你输入密码:

wKiom1fyPbCh5aNWAAASOv_H2dw419.png

wKiom1fyPcHRvHl0AAAqXsSCeg0593.png

解密:gpg加密的文件在本机执行解密时会直接解密而不需要输入密码,但在其它机子上时会要求输入密码。

本机解密:

[root@centos7 /testdir]#gpg -d issue.gpg > issue.2gpg: keyring `/root/.gnupg/secring.gpg' created
gpg: CAST5 encrypted data
gpg: encrypted with 1 passphrase
gpg: WARNING: message was not integrity protected
[root@centos7 /testdir]#lsissue  issue.2  issue.gpg
[root@centos7 /testdir]#cat issue.2\S
Kernel \r on an \m

[root@centos7 /testdir]

非本机解密:

wKioL1fyPdXC7X1qAABG3gVFKnQ869.png

gpg解密时除了重定向方式,还可以如下解密:

pgp -o file2 -d file.gpg   # -o 必须在前

使用gpg实现非对称加密

如centos 7要加密一个文件传给centos 6, 这个过程应该是要拿centos 6的公钥加密,所以要在centos 6上先生成公钥。

1.在hostA主机上生成公钥/私钥对:gpg –gen-key

此操作会用随机数生成密钥对儿,需要移动鼠标或敲击键盘,所以此命令最好在本地终端作:

wKiom1fyPerAUfXbAAFvu8p9QuU903.png

wKioL1fyPfuTL5X2AAC_b3-l9VQ534.png

2.在hostA主机上查看公钥:gpg–list-key

[root@centos6 ~]#gpg --list-key/root/.gnupg/pubring.gpg
------------------------
pub   2048R/79AC0435 2016-09-25uid                  liansir <admin@liansir>
sub   2048R/040E5B00 2016-09-25
[root@centos6 ~]#

wKiom1fyPhLTOiPeAAAt4mvqSak779.png

在hostA主机上导出公钥到liansir.pubkey

gpg -a --export -o liansir.pubkey-a 表示base64编码,这一步是转换成易读的编码

gpg生成的密钥对在家目录下的/.gnupg
[root@centos6 ~]#gpg -a --export -o liansir.pubkey # 直接导出到当前目录
[root@centos6 ~]#ls
anaconda-ks.cfg  Documents  f1           install.log.syslog  Music     Public     VideosDesktop          
Downloads  install.log  liansir.pubkey      Pictures  Templates
[root@centos6 ~]#

3.从hostA主机上复制公钥文件到需加密的B主机上

[root@centos6 ~]#scp liansir.pubkey 10.1.1.2:
root@10.1.1.2's password: 
liansir.pubkey                                                      100% 1707     1.7KB/s   00:00    
[root@centos6 ~]#

4.在需加密数据的hostB主机上生成公钥/私钥对: gpg –gen-key

[root@centos7 ~]#gpg --gen-key[root@centos7 ~]#gpg --list-key/root/.gnupg/pubring.gpg
------------------------
pub   2048R/0FE97934 2016-09-25uid                  zhizhan <admin@zhizhan.com>
sub   2048R/E43BDE3E 2016-09-25

5.在hostB主机上导入hostA的公钥: gpg –import

[root@centos7 ~]#gpg --import liansir.pubkey gpg: key 79AC0435: public key "liansir <admin@liansir>" imported
gpg: Total number processed: 1gpg:               imported: 1  (RSA: 1)
[root@centos7 ~]#[root@centos7 ~]#gpg --list-key/root/.gnupg/pubring.gpg
------------------------
pub   2048R/0FE97934 2016-09-25uid                  zhizhan <admin@zhizhan.com>
sub   2048R/E43BDE3E 2016-09-25pub   2048R/79AC0435 2016-09-25uid                  liansir <admin@liansir>
sub   2048R/040E5B00 2016-09-25
[root@centos7 ~]#

6.用从hostA主机导入的公钥,加密hostB主机的文件FILE,生成FILE.gpg

gpg -e -r liansir FILE
[root@centos7 /testdir]#gpg -e -r liansir fstab
gpg: 040E5B00: There is no assurance this key belongs to the named user

pub  2048R/040E5B00 2016-09-25 liansir <admin@liansir>
 Primary key fingerprint: F042 2A48 096B C16A D953  3D2C 8657 6F32 79AC 0435
      Subkey fingerprint: CC15 C943 A52A AF8A 1BE6  8B05 0C9D D197 040E 5B00

It is NOT certain that the key belongs to the person named
in the user ID.  If you *really* know what you are doing,
you may answer the next question with yes.

Use this key anyway? (y/N) y

[root@centos7 /testdir]#ls
fstab  fstab.gpg
[root@centos7 /testdir]#file fstab.gpg 
fstab.gpg: data
[root@centos7 /testdir]#

7.复制加密文件到hostA主机

[root@centos7 /testdir]#scp fstab.gpg 10.1.1.1:/testdir
root@10.1.1.1's password: 
fstab.gpg                                                           100%  812     0.8KB/s   00:00    
[root@centos7 /testdir]#

8.在hostA主机解密文件: gpg -o file -d file.gpg

[root@centos6 /testdir]#gpg -o fstab -d fstab.gpg 
gpg: encrypted with 2048-bit RSA key, ID 040E5B00, created 2016-09-25
      "liansir <admin@liansir>"

wKiom1fyQ4vDudbuAACDDjHW7ss051.png

至此,我们利用gpg工具就完成了一个完整的非对称加密过程,如果要删除公钥与私钥,如使用如下命令:

gpg --delete-secret-keys liansir
gpg --delete-keys liansir

wKiom1fyQ5-SEOyiAAClPtM4E1c796.png

ssh 服务

SSH
为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH
为建立在应用层基础上的安全协议。SSH是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH
协议可以有效防止远程管理过程中的信息泄露问题。

ssh的功能

传统的网络服务程序,如:ftp、smtp、telnet在本质上都是不安全的,因为它们在网络上用明文传送口令和数据,就是很容易受到“中间人”(man-in-the-middle)的攻击。所谓“中间人”的攻击方式,就是“中间人”冒充真正的服务器接收你传给服务器的数据,然后再冒充你把数据传给真正的服务器;通过使用SSH,你可以把所有传输的数据进行加密,这样"中间人"这种攻击方式就很难实现了,而且也能够防止DNS欺骗和IP欺骗。使用SSH,其传输的数据是经过压缩的,所以可以加快传输的速度。故SSH可以为这些不安全的服务提供一个安全的ssh隧道。

相关知识点:

ssh: secure shell, protocol, 22/tcp, 安全的远程登录
    OpenSSH: ssh协议的开源实现
    dropbear:另一个开源实现
SSH协议版本
    v1: 基于CRC-32做MAC,不安全;man-in-middle
    v2:双方主机协议选择安全的MAC方式
    基于DH算法做密钥交换,基于RSA或DSA实现身份认证
两种方式的用户登录认证:
    基于password
    基于key

ssh客户端

ssh的配置文件在/etc/ssh目录下,ssh_config为其客户端配置文件,sshd_config为其服务端配置文件。

ssh的使用格式:

格式:ssh[user@]host [COMMAND]
ssh[-l user] host [COMMAND]
-p port:远程服务器监听的端口-b:指定连接的源IP
-v:调试模式
-C:压缩方式
-X: 支持x11转发
-Y:支持信任x11转发ForwardX11Trusted yes
-t: 强制伪tty分配ssh-t remoteserver1 sshremoteserver2

修改ssh的默认端口与登陆

ssh服务的默认端口是tcp/22,可在ssh的配置文件下修改其默认端口,而centos 7还得修改selinux的相关配置:

# semanage port -a -t ssh_port_t -p tcp 2222

wKioL1fySFfzsju3AAAmQImwIY4435.png

sshd_config:

wKiom1fySHiS52kUAAA2mzgZqnU397.png

在centos 7上修改ssh的默认端口为2222,并重启服务

[root@centos7 ~]#semanage port -a -t ssh_port_t -p tcp 2222
[root@centos7 ~]#systemctl restart sshd

wKioL1fySI3gt4v5AABodwxfKvA628.png

现在让其它主机ssh连接时则必须要加相应的端口:-p portnum

[root@centos6 ~]#ssh 10.1.1.2 -p 2222root@10.1.1.2's password: 
Last login: Sun Sep 25 03:48:36 2016 from 10.1.252.68[root@centos7 ~]#

wKioL1fySJ7i-SJ3AAAtPlCvNig650.png

在ssh远程连接其它主机时,在当前用户的家目录下的.ssh目录里面,会生成一个known_hosts文件,这个文件记录了ssh的登录信息,远程主机的公钥,即远程主机的/etc/ssh/ssh_host_rsa_key.pub文件。

wKiom1fySK3gw7o9AABmmoBB_t0557.png

wKioL1fySMvTpZijAABwe--Any0705.png

此处记录公钥的目的是:在客户机在下次连接服务器时,因为服务器的公钥已经被复制到客户机的known_hosts文件中了,故在下次连接服务器时,服务器会用其私钥作一个数字签名发到客户机,而客户机则用之前保存的对方公钥解密,从而确定对方的身份!

小结:

允许实现对远程系统经验证地加密安全访问
当用户远程连接ssh服务器时,会复制ssh服务器/etc/ssh/ssh_host*key.pub
(centos7.0默认是ssh_host_ecdsa_key.pub)文件中的公钥到客户机的~./ssh/kno
w_hosts中。下次连接时,会比较两处是否有不同。

X协议转发

所有图形化应用程序都是X客户程序,x11能够通过tcp/ip连接远程X服务器,数据没有加密机,但是它通过ssh连接隧道安全进行。由于涉及到了图形界面程序,我们需要在本机上进行X协议转发。如:

ssh-X user@remotehostgeditsystem-config-users

wKiom1fySOTST8DDAACPcc7EEtE207.png

wKioL1fySPKARVJKAAFi2BLEUro069.png

如果我们想在通过远程连接工具,直接打开远程主机的桌面,Xmanager Enterprise提供了一个xstart的工具就可以做到。

wKiom1fySQLzgy2AAACaJDR3mh8041.png

wKioL1fySRjAbrOgAABla9SbJ3E864.png

点击运行会提示输入密码:接着您就会看到远程主机的桌面了!

wKiom1fySSjhTLjCAALRDx0vhh4032.png-wh_50

退出:system–> logout

绕过防火墙

ssh -t 是一个有意思的工具,可实现防火墙的跳转,一步到位跳转,强制分配“伪终端”。

场景:

wKioL1fySTmg_kKPAAAiPPYqX4I367.png

A: 互联网主机:10.1.1.2,centos 7
B,C: 局域网主机;10.1.1.1,cetntos 6 	10.1.1.3,centos 5防火墙:

A 无法访问C, 但A可以访问B,
C: iptables -A INPUT -s 10.1.1.2 -j REJECT

如果我们要使A成功访问C, 可如下操作:

操作:A ssh 到B, 在B上再ssh到C, 从而A成功访问C!

[root@rhel5.4 ~]#iptables -A INPUT -s 10.1.1.2 -j REJECT[root@rhel5.4 ~]#
[root@centos7 ~]#ssh 10.1.1.3 -b 10.1.1.2
ssh: connect to host 10.1.1.3 port 22: Connection refused
[root@centos7 ~]#

wKiom1fySV6S5AuMAABSCwfcXGg997.png

wKiom1fySXDx3-DlAAA5m3HKrDY826.png

其实我们可“一步到位”:

wKioL1fySYKyYpH9AACZPrgG7mE968.png

[root@centos7 ~]#ssh -t 10.1.1.1 ssh 10.1.1.3root@10.1.1.1's password: 
root@10.1.1.3's password: 
Last login: Sun Sep 25 18:36:22 2016 from 10.1.250.37[root@rhel5.4 ~]#exit
logout
Connection to 10.1.1.3 closed.
Connection to 10.1.1.1 closed.[root@centos7 ~]#

在centos 5上依然还是显示centos 6连接的它,而非centos 7.

基于key认证

当我们需要管理一大堆机器时,远程连接需要记住每个机器的密码,而且每次都得输入,不方便效率不高,基于key认证也帮助我们解决此问题!

1.在客户端生成密钥对

[root@centos7 ~]#ssh-keygen Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):  #密钥对保存的位置Enter passphrase (empty for no passphrase):   # 加密私钥,直接回车则不加密私钥Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
eb:00:81:3d:6f:c2:90:3b:8d:22:42:66:0c:26:44:33 root@liansirThe key's randomart image is:
+--[ RSA 2048]----+
|=E               |
|= o+             |
| =+ +            |
|+  * +           |
|+ + = o S        |
|o. . +   .       |
|      . .        |
|       o         |
|        .        |
+-----------------+
[root@centos7 ~]#[root@centos7 ~]#cd .ssh[root@centos7 ~/.ssh]#lsid_rsa  id_rsa.pub  known_hosts
[root@centos7 ~/.ssh]#

注意:

ssh-keygen -t rsa -p 为了安全,可以考虑给私钥加密,选项-p,从而在连接远程主机时需要输入私钥的密码

2.把公钥文件传输至远程服务器对应用户的家目录

[root@centos7 ~]#ssh-copy-id -i .ssh/id_rsa.pub 10.1.1.1/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keysroot@10.1.1.1's password: 

Number of key(s) added: 1Now try logging into the machine, with:   "ssh '10.1.1.1'"and check to make sure that only the key(s) you wanted were added.

[root@centos7 ~]#

公钥复制到远程服务器默认位置了,并会被改名为authorized_keys,且权限必须为600,基于key的认证,即使对方更改了口令,照样能够连接。

wKioL1fySaLx88yoAAA4HNSE6LA884.png

测试:

wKioL1fySbrgKfMiAAAwME8nGf0025.png

不输入任何密码又不太安全,假如有人正在运用你的机器。。。那就给重设私钥口令吧!

重设私钥口令:#ssh-keygen–p, 口令须大于4bites,否则失败

[root@centos7 ~]#ssh-keygen -pEnter file in which the key is (/root/.ssh/id_rsa): 
Key has comment '/root/.ssh/id_rsa'Enter new passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved with the new passphrase.
[root@centos7 ~]#

wKiom1fyScigccGRAAByNlX69a8701.png

测试:

wKiom1fySdejfcunAAA_rzrMxmE826.png

如此一来,您就不必记一大堆服务器的密码了,只须记住自己的私钥口令就OK了!但每次还是得输入,不爽!我们可以将口令托管于bash!

口令托管

基于key认证中,私钥口令的托管只需ssh-agent bash即可,然后用ssh-add 将口令添加给代理。

wKioL1fySeaibv87AABp1GbVQdc063.png

以上是在Linux中实现的,如果我们是在Windows中用Xshell或SecureCRT类似的工具应该如何设置呢?

Xshell:

wKiom1fySfmBo1saAACLzxvhaqI862.png

wKioL1fySgiBD0__AACPWu0PwWM040.png

wKiom1fyShWQiq3fAACHXnFsZHs712.png

wKioL1fySiTg767aAACR63Toaic167.png

wKioL1fySjTguGKxAACxDp5gOss456.png

保存到Windows桌面之后,就可导入到linux主机中:

[root@centos6 ~]#cat id_rsa_2048.pub >> .ssh/authorized_keys [root@centos6 ~]#

接着设置:

wKiom1fySkOzkuS3AABtQ2s3iX4313.png

wKiom1fySlTSnKXsAABio2OLX5c114.png

wKioL1fySmDhbhCGAABMoc0iie0700.png

SecureCRT:

wKiom1fySm_RNeJoAAA2isNgFas799.png

然后就一直下一步就行!CRT会同步生成公钥(Identity.pub)与私钥(Identity),最后只需导入公钥给 ssh 服务器就行。

注意:转化为openssh兼容格式(适合SecureCRT,Xshell不需要转化格式),并复制到需登录主机上相应文件authorized_keys中,注意权限必须为600。

转换:
ssh-keygen-i-f Identity.pub >> .ssh/authorized_keys

wKioL1fySoHDsv7SAAEn_pyaMt8014.png

可见二者的格式略有不同!

[root@centos6 ~]#ssh-keygen -i -f Identity.pub >> .ssh/authorized_keys 
[root@centos6 ~]#

wKioL1fySq_DM7q-AABvOMze1Ak879.png

wKioL1fySsTxPITdAABHYJ_V470862.png

先到这儿吧,本篇前文主要用gpg工具进行了一个完整的非对称加密,后文主要讲解了ssh的一个应用,如x11协议转发,强制分配tty一步到位实现绕过防火墙,最后就是基于key认证的内容。

原创文章,作者:Liansir,如若转载,请注明出处:http://www.178linux.com/49997

(0)
LiansirLiansir
上一篇 2016-10-06
下一篇 2016-10-06

相关推荐

  • Nginx 基础 (IO模型、编译安装、几大块配置文件详解)

    Nginx基础 前言 apache在设计的时候已经考虑了并发访问模型,select()机制可以响应1024个访问,但是当数量再大,千万级别的时候http就响应不过来了。这个时候,nginx的出现解决了这一个问题。nginx是一个安装简单、配置文件简单、占用内存少、稳定性高、处理并发能力非常强、灵活好用等有点聚集于一身的轻量级服务器。在Linux操作系统中,N…

    Linux干货 2016-12-24
  • 1.计算机的组成原理与linux初识

    计算机的组成原理 抽象 具体 Linux初识 负责与硬件交互,并向外提供系统调用 Linux大家庭 suse系列: opensuse suse enterprise redhat系列: centos redhat Debian系列: ubuntu debian 命令总结 显示本机IP(需要root权限) [root@localhost dev]# ifcon…

    Linux干货 2017-07-02
  • 04用户和组的相关配置文件总结

    1、用户 个人理解的是,给使用者一个在系统中使用的身份,即用户。 用户分两种:管理员和普通用户。 而每一个用户都有一些属性,每一个属性都是用冒号分割开来。配置文件存储在【/etc/passwd】中。 例如,sarash:x:507:508::/home/sarash:/bin/nologin 他们分别是,用户名,密码,ID号,主组ID号,注释,家目录,默认登…

    Linux干货 2016-10-24
  • 马哥教育网络班22期+第二周课程练习

    一、Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示? cp命令:copy,有2类复制方法  1、单源复制:如果DEST不存在:则实现创建此文件,并复制源文件的数据流至DEST中;     如果DEST存在:如果DEST是非目录文件,则覆盖目标文件;如果DEST是目录文件,则先DEST目录下创建一个与源文件…

    Linux干货 2016-08-22
  • 基于keepalived的VRRP协议实现DR模型下的高可用集群

    基于keepalived的VRRP协议实现DR模型下的高可用集群 环境及配置前提说明 4台虚拟服务器都为centos6.8. 主机1,ip:192.168.25.140 做后端RS1,80端口向外部提供web服务 主机2,ip:192.168.25.141 做后端RS2,80端口向外部提供web服务 ip:192.168.25.142为lo:0接口的VIP地…

    Linux干货 2016-11-07
  • shell脚本编程之函数

      在编写脚本时经常会遇到某个任务需要重复使用的问题,需每次都要输入同样的代码是件挺烦人的事情,还好可以通过编写函数还简化这项工作。   函数其实就是给一段代码起个名字,在每次使用这段代码的时候可以直接使用函数名来调用就可以了。 一、创建函数   创建函数的格式有两种:   格式1:function 函数名{ &nbs…

    Linux干货 2016-01-05