安全与加密
本章目录
- gpg的使用
- ssh服务
- dropbear
- aide
1. gpg的使用
GPG是加密和数字签名的免费工具,大多用于加密信息的传递。除了仅用密码加密外,GPG最大的不同是提供了“公钥/私钥”对。利用你的“公钥”别人加密信息不再需要告诉你密码,随时随地都能发送加密信息。而这种加密是单向的,只有你的“私钥”能解开加密。数字签名又是另一大使用方向。通过签名认证,别人能确保发布的消息来自你,而且没有经过修改。
使用gpg实现对称加密
gpg命令对称加密的简单用法
- 加密文件: $ gpg -c file
会生成file.gpg文件 - 解密文件: $ 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命令非对称加密的简单用法
- 创建密钥 $ gpg --gen-key
- 查看公钥 $ gpg --list-key
- 查看私钥 $ gpg --list-secret-key
- 公钥删除 $ gpg --delete-keys 标识名
- 私钥删除 $ gpg --delete-secret-keys 标识名
- 公钥导出 $ gpg --export 标识名 > 导出文件名(多以gpg,asc为文件后缀)
- 私钥导出 $ gpg --export-secret-key 标识名 > 导出文件名(多以asc为文件后缀)
- 密钥导入 $ gpg --import 密钥文件
- 加密文件 $ gpg --recipient 标识名 --encrypt 文件名
- 解密文件 $ gpg --output 新文件名 --decrypt 加密文件名
- 修改密钥 $ 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的验证
- 客户端生成密钥对
[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. ++. | | ...++ | +-----------------+
- 把公钥文件传输这远程服务器对应用户的家目录
[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.
- 验证
[root@zh ~]# ssh root@10.1.253.91 'ls' anaconda-ks.cfg backup2016-07-25 gpgtest gpgtest.gpg initial-setup-ks.cfg
- 在SecureCRT,Xshell或实现基于key验证
在SecureCRT工具—>创建公钥—>生成Identity.pub文件,转化为openssh兼容格式(适合SecureCRT,Xshell不需要转化格式),并复制到需登录主机上相应文件authorized_keys中,注意权限必须为600,在需登录的ssh主机上执行:
ssh-keygen -i -f Identity.pub >> .ssh/authorized_keys
- 重设私钥口令
- 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
- 验证代理(authentication agent)保密解密后的密钥
- 这样口令就只需要输入一次
- 在GNOME中,代理被自动提供
- 否则运行ssh-agent bash
- 钥匙通过命令添加给代理
- 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服务的最佳实践
- 不要使用默认端口
- 禁止使用protocol version 1
- 限制可登录用户
- 设定空闲会话超时时长
- 利用防火墙设置ssh访问策略
- 仅监听特定的IP地址
- 基于口令认证时,使用强密码策略
- 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示例
安装准备
- 安装开发包组
- 获得dropbear安装包
安装
- 解压缩安装包
- 查看安装文件:less INSTALL
- ./configure
- make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp"
- make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" install
启动ssh服务
- ls /usr/local/sbin/ /usr/local/bin/
- /usr/local/sbin/dropbear-h
- mkdir/etc/dropbear
- dropbearkey-t rsa-f /etc/dropbear/dropbear_rsa_host_key-s 2048
- dropbearkey-t dss-f /etc/dropbear/dropbear_dsa_host_key
- dropbear-p :2222 -F –E #前台运行; dropbear-p :2222 #后台运行
客户端访问
- ssh-p 2222 root@127.0.0.1
- 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