加密与安全

加密与安全

SSH端口转发

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

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

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

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

ssh 命令:

本地转发:

ssh  -L localport:remotehost:remotehostport  sshserver

本机端口;内网的端口 ;远程主机端口号 ;ssh服务器地址

选项:

-f 后台启用

-N 不打开远程shell,处于等待状态

-g 启用网关功能

示例

ssh –L 9527:telnetsrv:23 -N sshsrv

telnet 127.0.0.1 9527

当访问本机的9527的端口时,被加密后转发到sshsrv的ssh服务,再解密被转发到telnetsrv:23

dataçè localhost:9527 çè  localhost:XXXXX çè  sshsrv:22  çè  sshsrv:YYYYY çè telnetsrv:23

 

yum  install  telnet-server        安装telnet

 

远程转发:

-R sshserverport:remotehost:remotehostport sshserver

示例:

ssh –R 9527:telnetsrv:23 –N sshsrv

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

Data çè  sshsrv:9527 çè  sshsrv:22 çè  localhost:XXXXX çè  localhost:YYYYY çè  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

 

X 协议转发

所有图形化应用程序都是X客户程序

  • 能够通过tcp/ip连接远程X服务器
  • 数据没有加密机,但是它通过ssh连接隧道安全进行

ssh -X user@remotehost gedit

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

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

 

ssh服务器

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

常用参数

Port

ListenAddress ip

LoginGraceTime 2m

PermitRootLogin yes

StrictModes yes 检查.ssh/文件的所有者,权限等

MaxAuthTries 6

MaxSessions 10 同一个连接最大会话

PubkeyAuthentication yes

PermitEmptyPasswords no

PasswordAuthentication yes

 

常用参数:

GatewayPorts no

ClientAliveInterval:单位:秒

ClientAliveCountMax:默认3

UseDNS yes

GSSAPIAuthentication yes 提高速度可改为no

MaxStartups 未认证连接最大值,默认值10

Banner /path/file

限制可登录用户的办法

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的访问频度和并发在线数

经常分析日志

 

编译安装dropbear示例

ssh协议的另一个实现:dropbear

源码编译安装:

1、安装开发包组:yum groupinstall “Development tools”

2、下载dropbear-2017.75.tar.bz2

3、tar xf dropbear-2017.75.tar.bz2

4、less INSTALL README

5、./configure

6、make PROGRAMS=”dropbear dbclient dropbearkey dropbearconvert scp”

7、make PROGRAMS=”dropbear dbclient dropbearkey dropbearconvert scp” install

启动ssh服务:

8、ls /usr/local/sbin/ /usr/local/bin/

9、/usr/local/sbin/dropbear -h

10、mkdir /etc/dropbear

11、dropbearkey -t rsa -f /etc/dropbear/dropbear_rsa_host_key -s 2048

12、dropbearkey -t dss -f /etc/dropbear/dropbear_dsa_host_key

13、dropbear -p :2222 -F –E #前台运行

dropbear -p :2222 #后台运行

客户端访问:

14、ssh -p 2222 root@127.0.0.1

15、dbclient -p 2222 root@127.0.0.1

 

AIDE(Advanced 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

 

 

su 切换身份:su –l username –c ‘command‘

sudo          用于授权非常普遍

  • 来自sudo包
  • man 5 sudoers
  • sudo能够授权指定用户在指定主机上运行某些命令。如果未授权用户尝试使用 sudo,会提示联系管理员
  • sudo可以提供日志,记录每个用户使用sudo操作
  • sudo为系统管理员提供配置文件,允许系统管理员集中地管理用户的使用权限和使用的主机
  • sudo使用时间戳文件来完成类似“检票”的系统,默认存活期为5分钟的“入场券”
  • 通过visudo命令编辑配置文件,具有语法检查功能

visudo c 检查语法

配置文件:/etc/sudoers, /etc/sudoers.d/

口令的时间戳文件:/var/db/sudo  6版本      /var/run/sudo/ts  7版本   时间戳路径

日志文件:/var/log/secure      可以看到sudo的授权行为

配置文件支持使用通配符glob:

?:任意单一字符

* :匹配任意长度字符

[wxc]:匹配其中一个字符

[!wxc]:除了这三个字符的其它字符

\x : 转义

[[alpha]] :字母 示例: /bin/ls [[alpha]]*

 

 

 

sudo命令

ls -l /usr/bin/sudo

sudo –i –u wang 切换身份

sudo [-u user] COMMAND

-V 显示版本信息等配置信息 以及 显示sudo的一些必要信息

-u user 默认为root

-l,ll 列出用户在主机上可用的和被禁止的命令(ll  的格式会与l不同)

-v 再次延长密码有效期限为5分钟,更新时间戳(密码的有效期一般只有5分钟)

-k 清除时间戳(1970-01-01),下次需要重新输密码

-K 与-k类似,还要删除时间戳文件

-b 在后台执行指令

-p 改变询问密码的提示符号

示例:-p ”password on %h for user %p:”

 

 

 

export  EDITOR=vim

visudo  /etc/sudoers

wang  192.168.30.7=(root)     /bin/mount   /dev/cdrom     /mnt/   ( which   mount )

给与wang用户在192.168.30.7的主机上执行挂载命令的权限

mount  /dev/cdrom  /mnt/       两边需要一样,一点都不能变

不仅能授权用户还能授权组,不过要在组名前加上%

gpasswd  -d  wang   while

将wang用户从while组中移除

 

setfacl  -m  u:wang:rw  f1   授权wang用户对f1文件有rw权限

visudo  -f  /etc/sudoers.d/mage

visudo   -c   检查语法

 

 

配置文件规则有两类;

1、别名定义:不是必须的

2、授权规则:必须的

授权规则格式:

用户 登入主机=(代表用户) 命令

示例:

root  ALL=(ALL)  ALL    root在任何主机上(代表任何用户)拥有任何命令的权限

格式说明:

user: 运行命令者的身份

host: 通过哪些主机

(runas):以哪个用户的身份

command: 运行哪些命令

 

 

Users和runas:

username

#uid

%group_name

%#gid

user_alias|runas_alias

host:

ip或hostname

network(/netmask)

host_alias

command:

command name

directory

sudoedit

Cmnd_Alias

 

 

sudo别名和示例

别名有四种类型:User_Alias, Runas_Alias, Host_Alias ,Cmnd_Alias

别名格式:[A-Z]([A-Z][0-9]_)*   要当别名必须大写字母开头数字在后面,小写字母不能有

别名定义:

Alias_Type NAME1 = item1, item2, item3 : NAME2 = item4, item5  冒号隔开可以定义多个别名

示例1:

Student ALL=(ALL) ALL

%wheel ALL=(ALL) ALL

示例2:

student ALL=(root) /sbin/pidof,/sbin/ifconfig    每个命令要写完整路径

%wheel ALL=(ALL) NOPASSWD: ALL    代表不输任何口令的情况下执行任何命令

示例3

User_Alias NETADMIN= netuser1,netuser2

用户别名  别名    =用户1,用户2

Cmnd_Alias NETCMD = /usr/sbin/ip

系统别名

NETADMIN ALL=(root) NETCMD

示例4

User_Alias SYSADER=wang,mage,%admins

User_Alias DISKADER=tom

Host_Alias SERS=www.magedu.com,172.16.0.0/24

Runas_Alias OP=root

Cmnd_Alias SYDCMD=/bin/chown,/bin/chmod

Cmnd_Alias DSKCMD=/sbin/parted,/sbin/fdisk

SYSADER SERS= SYDCMD,DSKCMD

DISKADER ALL=(OP) DSKCMD

 

示例4

User_Alias ADMINUSER = adminuser1,adminuser2

Cmnd_Alias ADMINCMD = /usr/sbin/useradd, /usr/sbin/usermod, /usr/bin/passwd [a-zA-Z]*,

!/usr/bin/passwd root

ADMINUSER ALL=(root) NOPASSWD:ADMINCMD,PASSWD:/usr/sbin/userdel

示例5

Defaults:wang runas_default=tom

wang ALL=(tom,jerry) ALL

示例6

wang 192.168.175.136,192.168.175.138=(root) /usr/sbin/,!/usr/sbin/useradd

示例7

wang ALL=(ALL) /bin/cat /var/log/messages*

 

 

TCP_Wrappers介绍

作者:Wieste Venema,IBM,Google

工作在第四层(传输层)的TCP协议

对有状态连接的特定服务进行安全检测并实现访问控制

以库文件形式实现

某进程是否接受libwrap的控制取决于发起此进程的程序在编译时是否针对libwrap进行编译的

判断服务程序是否能够由tcp_wrapper进行访问控制的方法:

ldd /PATH/TO/PROGRAM|grep libwrap.so

strings PATH/TO/PROGRAM|grep libwrap.so

 

TCP_Wrappers的使用

配置文件:/etc/hosts.allow, /etc/hosts.deny     白名单你,黑名单

帮助参考:man 5 hosts_access,man 5 hosts_options

检查顺序:hosts.allow,hosts.deny(默认允许)allow 可以允许也支持拒绝,deny只支持拒绝;白名单优先级更高。

注意:一旦前面规则匹配,直接生效,将不再继续

基本语法:

daemon_list@host: client_list [ :options :option… ]

Daemon_list@host格式

单个应用程序的二进制文件名,而非服务名,例如vsftpd

以逗号或空格分隔的应用程序文件名列表,如:sshd,vsftpd

ALL表示所有接受tcp_wrapper控制的服务程序

主机有多个IP,可用@hostIP来实现控制

如:in.telnetd@192.168.0.254

客户端Client_list格式

以逗号或空格分隔的客户端列表

基于IP地址:192.168.10.1 192.168.1.

基于主机名:www.magedu.com .magedu.com 较少用

基于网络/掩码:192.168.0.0/255.255.255.0

基于net/prefixlen: 192.168.1.0/24(CentOS7)

基于网络组(NIS 域):@mynetwork

内置ACL:ALL,LOCAL,KNOWN,UNKNOWN,PARANOID

EXCEPT用法:

示例:vsftpd: 172.16. EXCEPT 172.16.100.0/24 EXCEPT 172.16.100.1

示例:只允许192.168.1.0/24的主机访问sshd

/etc/hosts.allow

sshd: 192.168.1.

/etc/hosts.deny

sshd :ALL

示例:只允许192.168.1.0/24的主机访问telnet和vsftpd服务

/etc/hosts.allow

vsftpd,in.telnetd: 192.168.1.

/etc/host.deny

vsftpd,in.telnetd: ALL

 

TCP_Wrappers的使用

[:options]选项:

帮助:man 5 hosts_options

deny 主要用在/etc/hosts.allow定义“拒绝”规则

如:vsftpd: 172.16. :deny

allow 主要用在/etc/hosts.deny定义“允许”规则

如:vsftpd:172.16. :allow

spawn 启动一个外部程序完成执行的操作

twist 实际动作是拒绝访问,使用指定的操作替换当前服务,标准I/O和ERROR发送到客户端,默认至/dev/null

测试工具:

tcpdmatch [-d] daemon[@host] client

-d 测试当前目录下的hosts.allow和hosts.deny

示例

sshd: ALL :spawn echo “$(date +%%F) login attempt from %c to %s,%d” >>/var/log/sshd.log

说明:

在/etc/hosts.allow中添加,允许登录,并记录日志

在/etc/hosts.deny中添加,拒绝登录,并记录日志

%c 客户端信息

%s 服务器端信息

%d 服务名

%p 守护进程的PID

%% 表示%

vsftpd: 172.16. :twist /bin/echo “connection prohibited

 

 

PAM认证机制

PAM:Pluggable Authentication Modules    可插入的验证模块

认证库:文本文件,MySQL,NIS,LDAP等

Sun公司于1995 年开发的一种与认证相关的通用框架机制

PAM 是关注如何为服务验证用户的 API,通过提供一些动态链接库和一套统一的API,将系统提供的服务和该服务的认证方式分开

使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序

一种认证框架,自身不做认证

它提供了对所有服务进行认证的中央机制,适用于login,远程登录(telnet,rlogin,fsh,ftp,点对点协议(PPP)),su等应用程序中。系统管理员通过PAM配置文件来制定不同应用程序的不同认证策略;应用程序开发者通过在服务程序中使用PAM API(pam_xxxx( ))来实现对认证方法的调用;而PAM服务模块的开发者则利用PAM SPI来编写模块(主要是引出一些函数pam_sm_xxxx( )供PAM接口库调用),将不同的认证机制加入到系统中;PAM接口库(libpam)则读取配置文件,将应用程序和相应的PAM服务模块联系起来。

 

PAM相关文件

模块文件目录:/lib64/security/*.so

环境相关的设置:/etc/security/

主配置文件:/etc/pam.conf,默认不存在

为每种应用模块提供一个专用的配置文件:/etc/pam.d/APP_NAME

注意:如/etc/pam.d存在,/etc/pam.conf将失效

 

pam认证原理

PAM认证一般遵循这样的顺序:Service(服务)→PAM(配置文件)→pam_*.so

PAM认证首先要确定那一项服务,然后加载相应的PAM的配置文件(位于/etc/pam.d下),最后调用认证文件(位于/lib/security下)进行安全认证

 

PAM认证过程:

1.使用者执行/usr/bin/passwd 程序,并输入密码

2.passwd开始调用PAM模块,PAM模块会搜寻passwd程序的PAM相关设置文件,这个设置文件一般是在/etc/pam.d/里边的与程序同名的文件,即PAM会搜寻/etc/pam.d/passwd此设置文件

3.经由/etc/pam.d/passwd设定文件的数据,取用PAM所提供的相关模块来进行验证

4.将验证结果回传给passwd这个程序,而passwd这个程序会根据PAM回传的结果决定下一个动作(重新输入密码或者通过验证)

 

通用配置文件/etc/pam.conf格式

application type control module-path arguments

专用配置文件/etc/pam.d/* 格式

type control module-path arguments

说明:

服务名(application)

telnet、login、ftp等,服务名字“OTHER”代表所有没有在该文件中明确配置的其它服务

模块类型(module-type)

control PAM库该如何处理与该服务相关的PAM模块的成功或失败情况

module-path 用来指明本模块对应的程序文件的路径名

Arguments 用来传递给该模块的参数

 

模块类型(module-type)

Auth 账号的认证和授权

Account 与账号管理相关的非认证类的功能,如:用来限制/允许用户对某个服务的访问时间,当前有效的系统资源(最多可以有多少个用户),限制用户的位置(例如:root用户只能从控制台登录)实现账号的有效性检查

Password 用户修改密码时密码复杂度检查机制等功能

Session 用户获取到服务之前或使用服务完成之后需要进行一些附加的操作,如:记录打开/关闭数据的信息,监视目录等

-type 表示因为缺失而不能加载的模块将不记录到系统日志,对于那些不总是安装在系统上的模块有用

 

Control:控制

PAM库如何处理与该服务相关的PAM模块成功或失败情况

两种方式实现:

简单和复杂

简单方式实现:一个关健词实现

required :一票否决,表示本模块必须返回成功才能通过认证,但是如果该模块返回失败,失败结果也不会立即通知用户,而是要等到同一type中的所有模块全部执行完毕再将失败结果返回给应用程序。即为必要条件

requisite :一票否决,该模块必须返回成功才能通过认证,但是一旦该模块返回失败,将不再执行同一type内的任何模块,而是直接将控制权返回给应用程序。是一个必要条件

sufficient :一票通过,表明本模块返回成功则通过身份认证的要求,不必再执行同一type内的其它模块,但如果本模块返回失败可忽略,即为充分条件

optional :表明本模块是可选的,它的成功与否不会对身份认证起关键作用,其返回值一般被忽略

include: 调用其他的配置文件中定义的配置信息

 

复杂详细实现:使用一个或多个“status=action”

[status1=action1 status2=action …]

Status:检查结果的返回状态

Action:采取行为 ok,done,die,bad,ignore,reset

ok 模块通过,继续检查

done 模块通过,返回最后结果给应用

bad 结果失败,继续检查

die 结果失败,返回失败结果给应用

ignore 结果忽略,不影响最后结果

reset 忽略已经得到的结果

 

module-path: 模块路径

相对路径:

/lib64/security目录下的模块可使用相对路径

如:pam_shells.so、pam_limits.so

绝对路径:

模块通过读取配置文件完成用户对系统资源的使用控制

/etc/security/*.conf

注意:修改PAM配置文件将马上生效

建议:编辑pam规则时,保持至少打开一个root会话,以防止root身份验证错误

Arguments 用来传递给该模块的参数

 

pam文档说明

/user/share/doc/pam-*

rpm -qd pam

man –k pam_

man 模块名 如man rootok

《The Linux-PAM System Administrators’ Guide》

 

PAM模块示例:

模块:pam_shells

功能:检查有效shell

man pam_shells

示例:不允许使用/bin/csh的用户本地登录

vim /etc/pam.d/login

auth required pam_shells.so

vim /etc/shells

去掉 /bin/csh

useradd –s /bin/csh testuser

testuser将不可登录

tail /var/log/secure

模块:pam_securetty.so

功能:只允许root用户在/etc/securetty列出的安全终端上登陆

示例:允许root在telnet登陆

vi /etc/pam.d/remote

#auth required pam_securetty.so #将这一行加上注释

或者/etc/securetty文件中加入

pts/0,pts/1…pts/n

模块:pam_nologin.so

功能:

如果/etc/nologin文件存在,将导致非root用户不能登陆

如果用户shell是/sbin/nologin 时,当该用户登陆时,会显示/etc/nologin文件内容,并拒绝登陆

模块:pam_limits.so

功能:在用户级别实现对其可使用的资源的限制,例如:可打开的文件数量,可运行的进程数量,可用内存空间

修改限制的实现方式:

(1) ulimit命令,立即生效,但无法保存

-n 最多的打开的文件描述符个数

-u 最大用户进程数

-S 使用 soft(软)资源限制

-H 使用 hard(硬)资源限制

(2) 配置文件:/etc/security/limits.conf, /etc/security/limits.d/*.conf

配置文件:每行一个定义;

<domain> <type> <item> <value>

 

pam_limits.so

<domain> 应用于哪些对象

Username 单个用户

@group 组内所有用户

* 所有用户

<type> 限制的类型

Soft 软限制,普通用户自己可以修改

Hard 硬限制,由root用户设定,且通过kernel强制生效

- 二者同时限定

<item> 限制的资源

nofile 所能够同时打开的最大文件数量,默认为1024

nproc 所能够同时运行的进程的最大数量,默认为1024

<value> 指定具体值

示例:pam_limits.so

限制用户最多打开的文件数和运行进程数

/etc/pam.d/system-auth

session required pam_limits.so

vim /etc/security/limits.conf

apache – nofile 10240 apache用户可打开10240个文件

student hard nproc 20 不能运行超过20个进程

 

 

 

 

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/100819

发表评论

登录后才能评论

This site uses Akismet to reduce spam. Learn how your comment data is processed.

联系我们

400-080-6560

在线咨询

工作时间:周一至周五,9:30-18:30,节假日同时也值班

QR code