安全与加密

本章目录

  1. gpg的使用

  2. ssh服务

  3. dropbear

  4. aide

1. gpg的使用

GPG是加密和数字签名的免费工具,大多用于加密信息的传递。除了仅用密码加密外,GPG最大的不同是提供了“公钥/私钥”对。利用你的“公钥”别人加密信息不再需要告诉你密码,随时随地都能发送加密信息。而这种加密是单向的,只有你的“私钥”能解开加密。数字签名又是另一大使用方向。通过签名认证,别人能确保发布的消息来自你,而且没有经过修改。

使用gpg实现对称加密

gpg命令对称加密的简单用法

  1. 加密文件: $ gpg -c file
    会生成file.gpg文件

  2. 解密文件: $ gpg -o file -d file.gpg

示例

  • 对称加密file文件

[root@zh testdir]# gpg -c file
    # 会弹出对话框,输入密码后会生成加密文件
[root@zh testdir]# ls
file  file.gpg
    # 发往另一台主机
[root@zh testdir]# scp file.gpg 192.168.1.102:/testdir/
root@192.168.1.102's password: 
file.gpg                                         100%   46     0.0KB/s   00:00
  • 在另一台主机上解密file

[root@centos7 testdir]# gpg -d file.gpg 
    # 此处会提示输入密码
gpg: CAST5 encrypted data
gpg: encrypted with 1 passphrase
aa              # 解密内容直接显示在标准输出
gpg: WARNING: message was not integrity protected

[root@centos7 testdir]# gpg  -o file -d file.gpg  # 将解密内容保存至file文件中
gpg: CAST5 encrypted data
gpg: encrypted with 1 passphrase
gpg: WARNING: message was not integrity protected
[root@centos7 testdir]# cat file
aa

使用gpg工具实现公钥加密

gpg命令非对称加密的简单用法

  1. 创建密钥 $ gpg --gen-key

  2. 查看公钥 $ gpg --list-key

  3. 查看私钥 $ gpg --list-secret-key

  4. 公钥删除 $ gpg --delete-keys 标识名

  5. 私钥删除 $ gpg --delete-secret-keys 标识名

  6. 公钥导出 $ gpg --export 标识名 > 导出文件名(多以gpg,asc为文件后缀)

  7. 私钥导出 $ gpg --export-secret-key 标识名 > 导出文件名(多以asc为文件后缀)

  8. 密钥导入 $ gpg --import 密钥文件

  9. 加密文件 $ gpg --recipient 标识名 --encrypt 文件名

  10. 解密文件 $ gpg --output 新文件名 --decrypt 加密文件名

  11. 修改密钥 $ gpg --edit-key 标识名

示例

在hostB主机上用公钥加密,在hostA主机上解密

在hostA主机上生成公钥/私钥对

[root@zh ~]# gpg --gen-key 
# 输入命令之后会出现交互界面
gpg (GnuPG) 2.0.22; Copyright (C) 2013 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

请选择您要使用的密钥种类:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (仅用于签名)
   (4) RSA (仅用于签名)
您的选择? #回车选择默认
RSA 密钥长度应在 1024 位与 4096 位之间。
您想要用多大的密钥尺寸?(2048)
您所要求的密钥尺寸是 2048 位
请设定这把密钥的有效期限。
         0 = 密钥永不过期
      <n>  = 密钥在 n 天后过期
      <n>w = 密钥在 n 周后过期
      <n>m = 密钥在 n 月后过期
      <n>y = 密钥在 n 年后过期
密钥的有效期限是?(0) 
密钥永远不会过期
以上正确吗?(y/n)y

You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
    "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"

真实姓名:Groot
电子邮件地址:groot@linux.com
注释:test
您选定了这个用户标识:
    “Groot (test) <groot@linux.com>”

更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)?o
您需要一个密码来保护您的私钥。
#此时会弹出对话框

请输入密码:********
请再次输入密码:********

我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动
鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。
我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动
鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。
gpg: /root/.gnupg/trustdb.gpg:建立了信任度数据库
gpg: 密钥 45D0E9B1 被标记为绝对信任
公钥和私钥已经生成并经签名。

gpg: 正在检查信任度数据库
gpg: 需要 3 份勉强信任和 1 份完全信任,PGP 信任模型
gpg: 深度:0 有效性:  1 已签名:  0 信任度:0-,0q,0n,0m,0f,1u
pub   2048R/45D0E9B1 2016-11-29
密钥指纹 = F5E5 8D6F AD19 F92F 4F23  59AC 8C70 5D5D 45D0 E9B1
uid                  Groot (test) <groot@linux.com>
sub   2048R/3B5795EF 2016-11-29

################### 以上为交互内容####################

这里,首先要一个钥匙对才能公钥加密,这里根据系统情况不同,可能内容为英文。需要用户交互输入的地方,都通过"<====输入"这个标记指出来了。若对输入信息有所改动 ,可把 ~/.gnupg 目录下除 gpg.conf 以外的文件删除 ,再运行 gpg --gen-key 命令 ,或者使用 gpg 的 edit 选项 . 钥匙对放在 ~/.gnupg 目录下

在hostA主机上查看公钥

[root@zh ~]# gpg --list-keys
/root/.gnupg/pubring.gpg
------------------------
pub   2048R/BFB93149 2016-11-29
uid                  Groot (text) <groot@linux.com>
sub   2048R/29810E3D 2016-11-29

此处 pub(公匙)--- public key , ID : BFB93149 sub(私匙)--- secret key or private key , ID : 29810E3D 假如没使用root进行操作,可能会输出如下信息:"gpg: Warning: using insecure memory!" 警告没有锁定内存页 ,一般是连接网上操作有关安全方面的问题 ,没有事情的 ,可以作这样的改动 "# chmod 4755 /usr/bin/gpg"。

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

[root@zh ~]# gpg -a --export -o groot.pubkey
[root@zh ~]# ll groot.pubkey 
-rw-r--r-- 1 root root 1715 11月 29 10:32 groot.pubkey

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

[root@zh ~]# scp groot.pubkey hostB:/testdir/
The authenticity of host 'hostB (192.168.1.111)' can't be established.
ECDSA key fingerprint is fd:8d:a5:6e:ac:4d:45:05:48:81:19:a9:de:62:a3:44.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'hostB,192.168.1.111' (ECDSA) to the list of known hosts.
root@hostB's password: 
groot.pubkey                                     100% 1715     1.7KB/s   00:00

在需加密数据的hostB主机上生成公钥/私钥对 gpg --list-keys gpg --gen-key

在hostB主机上导入公钥

[root@zheng ~]# gpg --import /testdir/groot.pubkey 
gpg: 密钥 BFB93149:公钥“Groot (text) <groot@linux.com>”已导入
gpg: 合计被处理的数量:1
gpg:           已导入:1  (RSA: 1)
[root@zheng ~]# gpg --list-keys
/root/.gnupg/pubring.gpg
------------------------
pub   2048R/BFB93149 2016-11-29
uid                  Groot (text) <groot@linux.com>
sub   2048R/29810E3D 2016-11-29

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

[root@zheng ~]# gpg -e -r Groot  gpgtest 
[root@zheng ~]# ll gpg*
-rw-r--r--. 1 root root  16 11月 29 10:53 gpgtest
-rw-r--r--. 1 root root 355 11月 29 11:01 gpgtest.gpg

复制加密文件到hostA主机

[root@zheng ~]# scp gpgtest.gpg hostA:/testdir/
The authenticity of host 'hosta (192.168.1.105)' can't be established.
ECDSA key fingerprint is cc:6d:c9:4a:8f:78:7a:b7:87:01:6d:c8:2d:28:cd:26.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'hosta,192.168.1.105' (ECDSA) to the list of known hosts.
root@hosta's password: 
gpgtest.gpg                                      100%  355     0.4KB/s   00:00

在hostA主机解密文件

[root@zh ~]# gpg -o gpgtest -d /testdir/gpgtest.gpg  

您需要输入密码,才能解开这个用户的私钥:“Groot (text) <groot@linux.com>”
2048 位的 RSA 密钥,钥匙号 29810E3D,建立于 2016-11-29 (主钥匙号 BFB93149)
# 此时会弹出对话框,输入密码即可
gpg: 由 2048 位的 RSA 密钥加密,钥匙号为 29810E3D、生成于 2016-11-29
      “Groot (text) <groot@linux.com>”
[root@zh ~]# cat gpgtest 
hello,I'm Groot

2. ssh服务

SSH 为 Secure Shell 的缩写,安全外壳协议,默认监听于tcp/22端口 ,由 IETF 的网络小组(Network Working Group)所制定;SSH 为建立在应用层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。SSH在正确使用时可弥补网络中的漏洞。SSH客户端适用于多种平台。几乎所有UNIX平台—包括HP-UX、Linux、AIX、Solaris、Digital UNIX、Irix,以及其他平台,都可运行SSH。

  • ssh协议的实现

    • OpenSSH: ssh协议的开源实现

    • dropbear:另一个开源实现

  • SSH协议版本

    • v1: 基于CRC-32做MAC,不安全;man-in-middle

    • v2:双方主机协议选择安全的MAC方式 基于DH算法做密钥交换,基于RSA或DSA实现身份认证

  • 两种方式的用户登录认证:

    • 要求提供相匹配的密钥信息才能通过验证。通常先在客户机中创建一对密钥文件(公钥和私钥),将公钥文件放到服务器中的指定位置。

    • 以服务器中本地系统用户的登陆名称,密码进行验证。

    • 基于password

    • 基于key

注: 当密码验证和密钥对验证都启用时,服务器将优先启用密钥对验证

openssh服务

OpenSSH服务,sshd,是一个典型的独立守护进程,但也可以根据需要通过网络守护进程或Ineternet Daemon's moremodern-xinted加载。OpenSSH服务可以通过/etc/ssh/sshd_config文件进行配置。基于c/s架构,客户端应用通常为:ssh,scp,sftp;服务端则为sshd服务进程。

ssh客户端

  • 客户端组件:ssh

    • 配置文件: /etc/ssh/ssh_config

  • 格式:

    • ssh [user@]host [command]

    • ssh [-l user] host [command]

  • 常用选项:

    • ForwardX11Trusted yes -t: 强制伪tty分配

    • ssh -t remoteserver1 sshremoteserver2

    • p port:远程服务器监听的端口

    • b:指定连接的源IP

    • v:调试模式

    • C:压缩方式

    • X: 支持x11转发

    • Y:支持信任x11转发

当用户远程连接ssh服务器时,会复制ssh服务器/etc/ssh/ssh_host*key.pub(centos7.0默认是ssh_host_ecdsa_key.pub)文件中的公钥到客户机的~./ssh/know_hosts中。下次连接时,会比较两处是否有不同。

  • 基于key的验证

  1. 客户端生成密钥对

[root@zh ~]# ssh-keygen -t rsa -P '' -f "/root/.ssh/id_rsa"
Generating public/private rsa key pair.
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:
b4:a6:a1:e8:35:85:de:ce:69:69:2a:5c:f4:47:44:ad root@zh.linux.com
The key's randomart p_w_picpath is:
+--[ RSA 2048]----+
|       ...       |
|        . .      |
|       ...       |
|    .. .E.       |
|   ...o.S        |
|   o.+.+.        |
| ...= oo         |
| .o. ++.         |
|  ...++          |
+-----------------+
  1. 把公钥文件传输这远程服务器对应用户的家目录

[root@zh ~]# ssh-copy-id -i .ssh/id_rsa.pub root@10.1.253.91
/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 keys
root@10.1.253.91's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@10.1.253.91'"
and check to make sure that only the key(s) you wanted were added.
  1. 验证

[root@zh ~]# ssh root@10.1.253.91 'ls'
anaconda-ks.cfg
backup2016-07-25
gpgtest
gpgtest.gpg
initial-setup-ks.cfg
  1. 在SecureCRT,Xshell或实现基于key验证

在SecureCRT工具—>创建公钥—>生成Identity.pub文件,转化为openssh兼容格式(适合SecureCRT,Xshell不需要转化格式),并复制到需登录主机上相应文件authorized_keys中,注意权限必须为600,在需登录的ssh主机上执行:

ssh-keygen -i -f Identity.pub >> .ssh/authorized_keys

  1. 重设私钥口令

  • ssh-keygen -p

[root@zh .ssh]# ssh-keygen -p
Enter 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@zh .ssh]# cd
[root@zh ~]# ssh root@10.1.253.91 'ls'
Enter passphrase for key '/root/.ssh/id_rsa': 
anaconda-ks.cfg
backup2016-07-25
gpgtest
gpgtest.gpg
initial-setup-ks.cfg
  1. 验证代理(authentication agent)保密解密后的密钥

  • 这样口令就只需要输入一次

  • 在GNOME中,代理被自动提供

  • 否则运行ssh-agent bash

  1. 钥匙通过命令添加给代理

  • ssh-add

scp命令

scp命令用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的。可能会稍微影响一下速度。当你服务器硬盘变为只读read only system时,用scp可以帮你把文件移出来。另外,scp还非常不占资源,不会提高多少系统负荷,在这一点上,rsync就远远不及它了。虽然 rsync比scp会快一点,但当小文件众多的情况下,rsync会导致硬盘I/O非常高,而scp基本不影响系统正常使用。

  • 语法: scp[options] SRC... DEST/

    • scp[options] [user@]host:/sourcefile/destpath

    • scp[options] /sourcefile[user@]host:/destpath

    • 两种方式:

  • 常用选项:

    • -C: 压缩数据流

    • -r: 递归复制

    • -p: 保持原文件的属性信息

    • -q: 静默模式

    • -P PORT: 指明remote host的监听的端口

rsync命令

rsync命令是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。 rsync是一个功能非常强大的工具,其命令也有很多功能特色选项,我们下面就对它的选项一一进行分析说明。

  • 基于ssh和rsh服务实现高效率的远程系统之间复制文件,比scp更快,只复制不同的文件

  • 使用安全的shell链接作为传输方式

    • rsync –av /etc server1:/tmp 复制目录和目录下文件

    • rsync –av /etc/ server1:/tmp 只复制目录下文件

  • 常用选项:

    • -n 模拟复制过程

    • -v 显示详细过程

    • -r 递归复制目录树

    • -p 保留权限

    • -t 保留时间戳

    • -g 保留组信息

    • -o 保留所有者信息

    • -l 把符号链接文件做为符号文件进行复制(默认)

    • -L 将软链接文件指向文件复制

    • -a 存档模式,相当于–rlptgoD,但不保留ACL(-A)和SELinux属性(-X)

sftp命令

  • 交互式文件传输工具

  • 用法能和传统的ftp工具相似

  • 利用ssh服务实现安全的文件上传和下载

  • 使用ls,cd,mkdir, rmdir,pwd,get, put等指令,可用?获取帮助信息。

    • sftp [user@]host

    • sftp> help

ssh端口转发

什么是SSH端口转发?

SSH 会自动加密和解密所有SSH客户端与服务端之间的网络数据。但是,SSH 还能够将其他TCP 端口的网络数据通过SSH 链接来转发,并且自动提供了相应的加密及解密服务。这一过程也被叫做“隧道”(tunneling),这是因为SSH 为其他TCP 链接提供了一个安全的通道来进行传输而得名。例如,Telnet,SMTP,LDAP 这些TCP 应用均能够从中得益,避免了用户名,密码以及隐私信息的明文传输。而与此同时,如果工作环境中的防火墙限制了一些网络端口的使用,但是允许SSH 的连接,也能够通过将TCP 端口转发来使用SSH 进行通讯

SSH端口转发能够提供两大功能

  • 加密SSH Client 端至SSH Server 端之间的通讯数据

  • 突破防火墙的限制完成一些之前无法建立的TCP 连接。

SSH端口转发

  • 本地转发:-L localport:host:hostport sshserver

    • 格式: ssh -L 9527:telnetserver:23 -N sshserver

telnet 127.0.0.1 9527 当访问本机的9527的端口时,被加密后转发到sshsrv的ssh服务,再解密被转发到telnetsrv:23 data <> localhost:9527 <> localhost:XXXX <> sshserver:22 <> sshserver:YYYYY <> telnetserver:23

  • 选项; -f 后台启用 -N 不开远程shell -g 启用网关功能

  • 远程转发: -R sshserverport:host:hostport sshserver

    • 格式: ssh -R 9527:telnetserver:23 -N sshserver

让sshsrv侦听9527端口的访问,如有访问,就加密后通过ssh服务转发请求到本机ssh客户端,再由本机解密后转发到telnetsrv:23 Data<>sshsrv:9527 <>sshsrv:22 <>localhost:XXXXX<>localhost:YYYYY<>telnetsrv:23

  • 动态端口转发: 当用firefox访问internet时,本机的1080端口做为代理服务器,firefox的访问请求被转发到sshserver上,由sshserver替之访问internet 在本机firefox设置代理socket proxy:127.0.0.1:1080 #ssh -D 1080 root@sshserver

  • X协议转发

    • remotehost主机上的gedit工具,将会显示在本机的X服务器上

    • 传输的数据将通过ssh连接加密

    • 能够通过tcp/ip协议连接远程X服务器

    • 数据没有加密机,但是它通过ssh链接隧道安全进行

    • 所有图像化应用程序都是X客户程序

    • ssh -X user@remotehost gedit

ssh服务器

  • 服务器端:sshd,配置文件:/etc/ssh/sshd_config

  • 常用参数:

    • Port

    • ListenAddressip

    • PermitRootLoginyes

    • ClientAliveInterval0

    • UseDNSyes

  • 限制可登录用户的办法:

    • AllowUsers user1 user2 user3

    • DenyUsers

    • AllowGroups

    • DenyGroups

ssh服务的最佳实践

  1. 不要使用默认端口

  2. 禁止使用protocol version 1

  3. 限制可登录用户

  4. 设定空闲会话超时时长

  5. 利用防火墙设置ssh访问策略

  6. 仅监听特定的IP地址

  7. 基于口令认证时,使用强密码策略

  • tr -dc A-Za-z0-9_ < /dev/urandom| head -c 30 | xargs

使用基于密钥的认证禁止使用空密码禁止root用户直接登录限制ssh的访问频度和并发在线数做好日志,经常分析

3. dropbear

Dropbear是一个相对较小的SSH服务器和客户端。它运行在一个基于POSIX的各种平台。 Dropbear是开源软件,在麻省理工学院式的许可证。 Dropbear是特别有用的“嵌入”式的Linux(或其他Unix)系统,如无线路由器。

dropbear实现完整的SSH客户端和服务器版本2协议。它不支持SSH版本1 的向后兼容性,以节省空间和资源,并避免在SSH版本1的固有的安全漏洞。还实施了SCP的。SFTP支持依赖于一个二进制文件,可以通过提供的OpenSSH或类似的计划。

编译安装dropbear示例

安装准备

  1. 安装开发包组

  2. 获得dropbear安装包

安装

  1. 解压缩安装包

  2. 查看安装文件:less INSTALL

  3. ./configure

  4. make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp"

  5. make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" install

启动ssh服务

  1. ls /usr/local/sbin/ /usr/local/bin/

  2. /usr/local/sbin/dropbear-h

  3. mkdir/etc/dropbear

  4. dropbearkey-t rsa-f /etc/dropbear/dropbear_rsa_host_key-s 2048

  5. dropbearkey-t dss-f /etc/dropbear/dropbear_dsa_host_key

  6. dropbear-p :2222 -F –E #前台运行; dropbear-p :2222 #后台运行

客户端访问

  1. ssh-p 2222 root@127.0.0.1

  2. dbclient-p 2222 root@127.0.0.1

4. aide

当一个入侵者进入了你的系统并且种植了木马,通常会想办法来隐蔽这个木马(除了木马自身的一些隐蔽特性外,他会尽量给你检查系统的过程设置障碍),通常入侵者会修改一些文件,比如管理员通常用ps -aux来查看系统进程,那么入侵者很可能用自己经过修改的ps程序来替换掉你系统上的ps程序,以使用ps命令查不到正在运行的木马程序。如果入侵者发现管理员正在运行crontab作业,也有可能替换掉crontab程序等等。所以由此可以看出对于系统文件或是关键文件的检查是很必要的。目前就系统完整性检查的工具用的比较多的有两款:Tripwire和AIDE,前者是一款商业软件,后者是一款免费的但功能也很强大的工具。

  • AIDE(Adevanced Intrusion Detection Environment) 入侵检测工具

  • 高级入侵检测环境)是一个入侵检测工具,主要用途是检查文件的完整性,审计计算机上的那些文件被更改过了。

  • AIDE能够构造一个指定文件的数据库,它使用aide.conf作为其配置文件。AIDE数据库能够保存文件的各种属性,包括:权限(permission)、索引节点序号(inode number)、所属用户(user)、所属用户组(group)、文件大小、最后修改时间(mtime)、创建时间(ctime)、最后访问时间(atime)、增加的大小以及连接数。AIDE还能够使用下列算法:sha1、md5、rmd160、tiger,以密文形式建立每个文件的校验码或散列号.

  • 这个数据库不应该保存那些经常变动的文件信息,例如:日志文件、邮件、/proc文件系统、用户起始目录以及临时目录.

AIDE的安装

  • 安装: yum install aide

  • 修改配置文件

    • vim /etc/aide.conf(指定对哪些文件进行检测)

    • /test/chameleon R/bin/ps R+a/usr/bin/crontab R+a

    • /etc PERMS

    • !/etc/mtab #“!”表示忽略这个文件的检查

    • R=p+i+n+u+g+s+m+c+md5 权限+索引节点+链接数+用户+组+大小+最后一次修改时间+创建时间+md5校验值

    • NORMAL = R+rmd60+sha256

  • 初始化默认的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