安全与加密

本章目录

  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



转载于:https://blog.51cto.com/groot/1879615