全网最全安全加固指南

Posted CKCsec

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了全网最全安全加固指南相关的知识,希望对你有一定的参考价值。

干货 | 全网最全安全加固指南

安全加固相关概念阐述

安全加固定义

安全加固和优化是实现信息系统安全的关键环节。通过安全加固,将在信息系统的网络层、主机层、软件层、应用层等层次建立符合安全需求的安全状态,并以此作为保证客户信息系统安全的起点。

安全加固是配置软件系统的过程,针对服务器操作系统、数据库及应用中间件等软件系统,通过打补丁、强化帐号安全、加固服务、修改安全配置、优化访问控制策 略、增加安全机制等方法,堵塞漏洞及“后门”,合理进行安全性加强,提高其健壮性和安全性,增加攻击者入侵的难度,提升系统安全防范水平。

为什么需要安全加固

应用系统运行所需的软硬件,往往存在以下安全问题:

  1. 安装、配置不符合安全需求
  2. 参数配置错误
  3. 使用、维护不符合安全需求
  4. 系统完整性被破坏
  5. 被注入木马程序
  6. 帐户/口令问题
  7. 安全漏洞没有及时修补
  8. 应用服务和应用程序滥用
  9. 应用程序开发存在安全问题等

安全加固内容

  1. 正确的安装
  2. 安装最新和全部OS和应用软件的安全补丁
  3. 操作系统、系统软件、应用软件的安全配置
  4. 系统安全风险防范
  5. 提供系统使用和维护建议
  6. 系统功能测试
  7. 系统安全风险测试
  8. 系统完整性备份
  9. 必要时重建系统等

安全加固目标

加固目标也就确定系统在做过加固和优化后,达到的安全级别

  • 解决目标系统在安全评估中发现的技术性安全问题。
  • 对系统性能进行优化配置,杜绝系统配置不当而出现的弱点。

通常不同环境下的系统对安全级别的要求不同,由此采用的加固方案也不同。

安全加固原则

明确加固目标的结果必须能够明确做加固和优化的系统如何在功能性与安全性之间寻求平衡。

  • 修补加固内容不能影响目标系统所承载的业务运行

  • 修补加固不能严重影响目标系统的自身性能

  • 修补加固操作不能影响与目标系统以及与之相连的其它系统的安全性, 也不能造成性能的明显下降

安全加固基线的内容

系统加固

Windows系统安全加固

Windows常用系统命令

命令说明
ver查看系统版本
hostname查看主机名
ipconfig /all查看网络配置
net user/localgroup/share/config查看用户/用户组/共享/当前运行可配置服务
at建立或查看系统作业
netstat查看开放端口
secpol.msc查看和修改本地安全设置
services.msc查看和修改服务
eventvwr.msc查看日志
regedit打开注册表
whoami查看当前操作用户的用户名

Windows常见端口

端口说明
80/8080/8081HTTP协议代理服务器常用端口号
443HTTPS协议代理服务器常用端口号
21FTP(文件传输协议)协议代理服务器常用端口号
23Telnet(远程登录)协议代理服务器常用端口号
22SSH(安全登录)、SCP(文件传输)
1521Oracle 数据库
1433MS SQL SERVER数据库
1080QQ
3306mysql数据库
25SMTP(简单邮件传输协议)

Windows账号及安全策略

账号安全是计算机系统安全的第一关,如果计算机系统账号被盗用,那么计算机将非常危险,入侵者可以任意控制计算机系统,如果计算机中存在着重要的机密文件,或者银行卡号和密码,那么损失会非常严重。

账号安全设置
设置方法:“开始”—“运行”输入secpol.msc(控制面板——管理工具)
立即生效:gpupdate /force

账号策略
密码必须符合复杂性要求:启用
密码长度最小值 8个字符
密码最长使用期限: 30天
强制密码历史: 3个记住的密码

账号锁定
帐户锁定阀值: 3次无效登陆
帐户锁定时间: 30分钟
复位帐户锁定计数器:30分钟之后

账户密码策略

账户锁定策略

Administartor账号、组重命名

Administartor账号、组重命名,可增加账号安全性

wmic useraccount where name='Administrator' call Rename admin

禁用Guest账户权限

我的电脑“右击”管理“打开—计算机管理—本地用户和组—用户—Guest—右键—属性—常规—选择“账户已禁用”

net user guest /active:no

日志及审核策略

在一个完整的信息系统里面,日志系统是一个非常重要的功能组成部分。它可以记录下系统所产生的所有行为,并按照某种规范表达出来。我们可以使用日志系统所记录的信息为系统进行排错,优化系统的性能,或者根据这些信息调整系统的行为。在安全领域,日志系统的重要地位尤甚,可以说是安全审计方面最主要的工具之一。

对重要事件进行审核记录,方便日后出现问题时查找问题根源。
审核策略:

审核策略更改 		成功,失败 
审核登陆事件 		成功,失败
审核对象访问 		失败   
审核目录服务访问   失败 
审核特权使用		失败   
审核系统事件 		成功,失败  
审核账户登陆事件   成功,失败  
审核帐户管理		成功,失败 

调整事件日志的大小及覆盖策略

日志安全设置
设置方法:“开始”—“运行”输入eventvwr.msc
增大日志大小,避免由于日志文件容量过小导致重要日志记录遗漏

日志类型		日志大小	覆盖策略
应用程序		80000KB	覆盖早于30天的日志
安全日志		80000KB	覆盖早于30天的日志
系统日志		80000KB	覆盖早于30天的日志

安全选项策略设置

本地安全策略->本地策略->安全选项

  • Microsoft 网络服务器:当登录时间用完时自动注销用户(启用)

目的:可以避免用户在不适合的时间登录到系统,或者用户登录到系统后忘记退出登录

  • Microsoft 网络服务器:在挂起会话之前所需的空闲时间(小于等于30分钟)

目的:设置挂起会话之前所需的空闲时间为30分钟

  • Microsoft 网络客户端:发送未加密的密码到第三方SMB服务器(禁用)

目的:禁止发送未加密的密码到第三方SMB服务器

  • 故障恢复控制台:允许对所有驱动器和文件夹进行软盘复制和访问(禁用)

目的:禁止它访问硬盘驱动器上的所有文件和目录。它仅允许访问每个卷的根目录%systemroot%目
录及子目录,即使是这样它还限制不允许把硬盘驱动器上的文件拷贝到软盘上

  • 故障恢复控 制台:允许自动系统管理级登录(禁用)

目的:恢复控制台是Windows 2003的一个新特性,它在一个不能启动的系统上给出一个受限的命令行访问界面。可能会导致任何可以重起系统的人绕过账号口令限制和其它安全设置而访问系统

  • 关机:清除虚拟内存页面文件(启用)

目的:某些第三方的程序可能把一些没有的加密的密码存在内存中,页面文件中也可能含有另外一些敏感的资料。关机的时候清除页面文件,防止造成意外的信息泄漏

  • 关机:允许系统在未登录前关机(禁用)

目的:在未登录前不能关闭计算机

  • 交互式登录:不显示上次的用户名(启用)

目的:登陆时不显示上次的用户名,防止暴露用户名。

  • 交互式登录:不需要按Ctrl+Alt+Del(禁用)

目的:登录时需要按CTRL+ALT+DEL

  • 交互式登录:可被缓存的前次登录个数(设置缓存数为0,此项对域服务器无效。)

目的:登陆时不显示上次的用户名,防止暴露用户名

  • 网络访问:不允许为网络身份验证储存凭证或 .NET passports(启用)

  • 审核:如果无法记录安全审核则立即关闭系统 (启用)

  • 审核:对全局系统对象的访问进行审核(启用)

  • 网络访问:本地账户的共享和安全模式:仅来宾–本地账户以来宾用户身份验证

  • 网络访问:可匿名访问的共享(全部删除)

  • 网络访问:可匿名访问的命名管道 (全部删除)

  • 网络访问:可远程访问的注册表路径(全部删除)

  • 网络访问:可远程访问的注册表路径和子路径 (全部删除)

用户权限策略设置

  • 通过终端服务拒绝登陆”中加入Guests、User组
  • “通过终端服务允许登陆”中只加入Administrators组
  • “从网络访问此计算机”中删除PowerUsers和BackupOperators
  • “拒绝本地登录”中添加web和guest用户

NTFS安全

文件系统又被称作文件管理系统,它是指操作系统中负责管理和存储文件信息的软件机构。文件系统由与文件管理有关的软件、被管理的文件以及实施文件管理所需的数据结构这三部分构成。
从系统角度来看,文件系统是对文件存储器空间进行组织和分配,负责文件的存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤销文件等。

Windows权限的继承性、累加性、优先性、交叉性四项基本原则

  • Windows NT以后的文件,及文件夹共享设置有以下特性:继承性、累加性、优先性、交叉性。

  • 继承性:下级的目录在没有经过重新设置之前,是拥有上一级目录权限设置的。

  • 累加性:是说如一个组GROUP1中有两个用户USER1、USER2,他们同时对某文件或目录的访问权限分别为“读取”和“写入”,那么组GROUP1对该文件或目录的访问权限就为USER1和USER2的访问权限之和。

  • 优先性:权限的这一特性又包含两种子特性,其一是文件的访问权限优先目录的权限,也就是说文件权限可以越过目录的权限,不顾上一级文件夹的设置。另一特性就是“拒绝”权限优先其它权限,也就是说“拒绝”权限可以越过其它所有其它权限,一旦选择了“拒绝”权限,则其它权限也就不能取任何作用,相当于没有设置。

  • 交叉性:指当同一文件夹在为某一用户设置了共享权限的同时又为用户设置了该文件夹的访问权限,且所设权限不一致时,它的取舍原则是取两个权限的交集,也即最严格、最小的那种权限。如目录A为用户USER1设置的共享权限为“只读”,同时目录A为用户USER1设置的访问权限为“完全控制”,那用户USER1的最终访问权限为“只读”。

权限设置

系统分区C盘				                  administrator、system完全控制
C:\\Documents and Settings\\			     administrator、system完全控制
C:\\windows\\system32\\		             administrator读写
C:\\progran files	为Common File目录之外的所有目录赋予Administrators 和SYSTEM 完全控制
C:\\windows			系统管理员完全控制、system拒绝(继承)
C:\\windows\\system32	其关键程序只允许administrator完全控制
C:\\Inetpub\\			administrator、system完全控制,必要时可以删除该目录
网站目录所在磁盘	   administrator、system完全控制

注册表安全设置

通过注册表,用户可以轻易地添加、删除、修改windows系统内的软件配置信息或硬件驱动程序,这不仅方便了用户对系统软硬件的工作状态进行适时的调整,于此同时注册表也是入侵者攻击的目标,通过注册表也可称为入侵者攻击的目标,通过注册表植入木马、修改软件信息,甚至删除、停用或改变硬件的工作状态。

HKEY_LOCAL_MACHINE   包含关于本地计算机系统的信息,包括硬件和操作系统数据。
HKEY_LOCAL_ROOT          包含各种OLE技术使用的信息技术和文件类别关联数据
HKEY_LOCAL_USER           包含环境变量、桌面设置、网络连接、打印机和程序首选项。
HKEY_LOCAL_USERS         包含关于动态加载的用户配置文件和默认的配置文件的信息,有些信息和HKEY_CURRENT_USER交叉出现
HKEY_CURRENT_CONFIG  包含在启动时由本地计算机系统使用的硬件配置文件的相关信息。

利用文件管理器对regedit.exe文件设置成只允许管理员能使用命令访问修改注册表,其他用户只能读取,但不能修改这样就可以防止非法用户恶意修改注册表。

开始运行输入“regedit"运行注册表管理器

禁止自动登录

编辑注册表 HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion`
Winlogon\\AutoAdminLogon(REG_DWORD)值设置为0

reg add "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon" /v AutoAdminLogon  /d 0 /f

启用源路由欺骗保护
System\\CurrentControlSet\\ Services\\Tcpip\\Parameters\\ 新建(REG_DWORD) 值 名称为 DisableIPSourceRouting 参数为 2

reg add " System\\CurrentControlSet\\ Services\\Tcpip\\Parameters\\ " /v DisableIPSourceRouting   /t REG_DWORD /d 2 /f

目的:防护在网络上发生的源路由欺骗

禁止空链接

删除IPC共享
禁用IPC连接,编辑注册表HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Lsa\\restrictanonymous值为1

reg add "HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Lsa" /v restrictanonymous  /d 0 /f

删除系统默认共享

删除服务器上的管理员共享
HKLM\\System\\CurrentControlSet\\ Services\\LanmanServer\\Parameters\\AutoShareServer参数为0

#查看默认共享
net share
#删除默认共享
net share <共享名> /del

修改默认3389远程端口

修改注册表
HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Terminal Server\\Wds\\rdpwd\\Tds\\tcp\\PortNumber
它默认值是3389,这样我们可以修改成自己的想要的端口号,修改的时候要点十进制。

reg add "HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Terminal Server\\Wds\\rdpwd\\Tds\\tcp" /v PortNumber  /d 4445 /f

关闭135.139.445隐患端口

  • 关闭135端口

”开始“—“运行”,输入”dcomcnfg”,单击“确定”,打开组件服务
右键我的电脑,单击”属性”,在默认属性中去掉”在此计算机上启用分布式COM”前的勾
选择”默认协议”选项卡,选中“面向连接的TCP/IP”,单击”确定”按钮,设置完成,重新启动后即可关闭135端口

  • 关闭139端口

右键我的“网上邻居”,单击“属性”,再打开本地连接的“属性”
选中Internet协议(TCP/IP),常规选项卡-高级
设置WINS选项卡”禁用TCP/IP上的“NETBios

  • 关闭445端口

修改注册表,添加一个键值
HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\NetBT\\Parameters在右面的窗口新建一个SMBDeviceEnabled 为REG_DWORD类型键值为 0。

reg add "HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\services\\NetBT" /v SMBDeviceEnabled   /t REG_DWORD /d 0 /f

让配置立即生效

  1. 修改完后立即生效
  2. 重启explorer.exe进程就可以让修改注册表生效
  3. 重启计算机

Linux系统安全加固

系统用户

账号分类:
超级管理员	 uid=0,
系统默认用户	系统程序使用,从不登录
新建普通用户	uid大于500

/etc/password

/etc/shadow

liunx用户管理

#添加用户
useradd <用户名>
#删除用户
userdel [-r][-f] <用户名>

#锁定/解锁用户
passwd -l <用户名>
passwd -u <用户名>

#用户属性
usermod -L  <用户名>锁定用户 
usermod -U <用户名>解锁用户

#查看当前用户
id

解析文件权限

执行ls -l … … 命令查看

输出命令包括7个字段

权限与归属

  • 访问权限

读取:允许查看内容-read

写入:允许修改内容-write

可执行:允许运行和切换-excute

  • 归属关系

所有者:拥有此文件/目录的用户-user

所属者:拥有此文件/目录的组-group

其他用户:除所有者、所属组以外的用户-other

所有用户:以上三类归属称-all

文件系统安全

查看权限:
  	ls -l
修改权限:
	chmod 777 test	
	
	chown 123:123 test

	chgrp root test

设置合理的初始文件权限

UMASK命令:

umask值为0022所对应的默认文件和文件夹创建的缺省权限分别为644和755
文件夹其权限规则为:777-022=755
文件其权限规则为: 777-111-022=644(因为文件默认没有执行权限)
修改UMASK值:
1、直接在命令行下umask xxx (重启后消失)
2、修改/etc/profile中设定的umask值

linux提权漏洞

由于Linux 内核的内存子系统在处理 Copy-on-Write 时出现竞争条件(漏洞),导致私有的只读内存映射被破坏、获取读写权限后低权限用户可以进一步提权。

1.检查是否有内核升级包:yum check-update |grep kernel
2.升级内核:yum update kernel
3.确认下新版本的内核或 initrd/initramfs 是否有xen-vbd和virtio_blk驱动:

#lsinitrd /boot/initramfs-2.6.32-642.6.2.el6.x86_64.img |grep -i -E 'xen-blkfront|virtio_blk' -rwxr--r-- 1 root root 23448 Nov 4 16:21 lib/modules/2.6.32-642.6.2.el6.x86_64/kernel/drivers/block/virtio_blk.ko -rwxr--r-- 1 root root 54888 Nov 4 16:21 lib/modules/2.6.32-642.6.2.el6.x86_64/kernel/drivers/block/xen-blkfront.ko

如果没有,则需要给initrd/initramfs安装驱动,然后执行第三步后重启。

锁定系统中多余的自建帐号

执行命令

cat /etc/passwd
cat /etc/shadow

查看账户、口令文件,与系统管理员确认不必要的账号。对于一些保留的系统伪帐户如:bin, sys,

adm,uucp,lp, nuucp,hpdb, www, daemon等可根据需要锁定登陆。

加固方法:
  使用命令passwd -l <用户名>锁定不必要的账号。

使用命令passwd -u <用户名>解锁需要恢复的账号。

检查shadow中空口令帐号

检查方法:

awk -F ":" '($2=="!")print $1' /etc/shadow

加固方法:

#锁定不必要的账户
passwd -l <用户名>

#解锁需要恢复的账户
passwd -u <用户名>

#为用户设置密码
passwd <用户名>

设置系统密码策略

执行命令
cat /etc/login.defs|grep PASS  #查看密码策略设置
加固方法:
vi /etc/login.defs修改配置文件
	PASS_MAX_DAYS		90	   #用户的密码最长使用天数
	PASS_MIN_DAYS		0	   #两次修改密码的最小时间间隔
	PASS_MIN_LEN		7	   #密码的最小长度
	PASS_WARN_AGE	9       #密码过期前多少天开始提示

禁用root之外的超级用户

检测方法:

#检查用户ID为0的用户
awk -F ":" '($3=="0")print $1' /etc/passwd

加固方法:

#锁定用户
passwd -l <用户名>

限制能够su为root的用户

#查看是否有auth required /lib/security/pam_wheel.so这样的配置条目
cat /etc/pam.d/su

加固方法
在头部添加:

auth required /lib/security/pam_wheel.so group=wheel

这样,只有wheel组的用户可以su到root

#将test用户加入到wheel组
usermod -G10 test

重要文件加上不可改变属性

#把重要文件加上不可改变属性
chattr +i /etc/passwd
chattr +i /etc/shadow
chattr +i /etc/gshadow
chattr +i /etc/group
chattr +i /etc/inetd.conf
chattr +i /etc/httpd.conf

ssh安全

禁止root用户进行远程登录
检查方法:

#是否为no
cat /etc/ssh/sshd_config | grep PermitRootLogin 

加固方法

vi /etc/ssh/sshd_config 
PermitRootLogin no

更改服务端口

vi /etc/ssh/ssh_config
Port 2222				更改ssh端口

屏蔽SSH登录banner信息
检查方法:

#查看文件中是否存在banner字段,或banner字段为NONE
cat /etc/ssh/sshd_config
#查看文件内容,该处内容作为banner信息显示给登录用户
cat /etc/motd 

加固方法:

vim /etc/ssh/sshd_config

添加:

banner NONE
#vim /etc/motd

删除全部内容或更新成自己想要添加的内容

仅允许SSH协议版本2

有两个SSH协议版本,仅使用SSH协议版本2会更安全。

SSH协议版本1有安全问题,包括中间人攻击(man-in-the-middle)和注入(insertion)攻击。

编辑/etc/ssh/sshd_config文件并查找下面这样的行:

Protocol 2,1 

修改为

Protocol 2 

防止误使用Ctrl+Alt+Del重启系统

检查方法:

#查看输出行是否被注释

cat /etc/inittab |grep ctrlaltdel
#ca::ctrlaltdel:/sbin/shutdown -t3 -r now

加固方法:

vim /etc/inittab

在行开否添加注释符号“#”
#ca::ctrlaltdel:/sbin/shutdown -t3 -r now

设置账户锁定登录失败锁定次数锁定时间

检查方法:

cat /etc/pam.d/system-auth|grep auth 

查看有无auth required pam_tally.so 条目的设置
加固方法:

#设置为密码连续错误6次,锁定时间300秒
vi /etc/pam.d/system-auth
auth required pam_tally.so oneer=filad deny=6 unlock_time=300 

解锁用户:faillog -u <用户名> -r

修改账户TMOUT值,设置自动注销时间

检查方法:

#查看有无TMOUT的设置
cat /etc/profile|grep TMOUT 

加固方法:

vim /etc/profile

增加

TMOUT=600 

无操作600秒后自动退出

设置BASH保留历史命令的条目

检查方法:

cat /etc/profile | grep HISTSIZE
HISTSIZE=1000

加固方法:

vim /etc/profile

修改

HISTSIZE=5

即保留最新执行的5条命令

用户注销时删除命令记录

检查方法:
查看/etc/skel/.bash_logout文件,增加如下行

rm -f $HOME/.bash_history

这样,系统中的所有用户注销时都会删除其命令记录,如果只需要针对某个特定用户,如root用户进行设置,则可只在该用户的主目录下修改/$HOME/.bash_history文件增加相同的一行即可。

设置系统日志策略配置文件

日志的主要用途是系统审计、监测追踪和分析统计。
为了保证 Linux 系统正常运行、准确解决遇到的各种各样的系统问题,认真地读取日志文件是管理员的一项非常重要的任务。
UNIX/ Linux采用了syslog工具来实现此功能,如果配置正确的话,所有在主机上发生的事情都会被记录下来,不管是好的还是坏的。

CentOS6起/etc/syslog.conf不再有!而是/etc/rsyslog.conf代替!

检查方法:

ps -aef | grep syslog #确定syslog服务是否启用
cat /etc/rsyslog.conf #查看syslogd的配置,并确认日志文件日否存在
#系统日志 (默认)   
/var/log/messages
#cron日志 (默认)   
/var/log/cron
#安全日志 (默认)   
/var/log/secure

阻止系统响应任何从外部/内部来的ping请求

加固方法:

echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

其他客户端就不能ping通你的服务器了。

中间件加固

IIS加固

IIS安装及版本的选择

在IIS安装过程中,根据具体的业务需求,只安装必要的组件,以避免安装其他一切不必要的组件带来的安全风险。如网站正常运行只需要ASP环境,那我们就没必要安装.net组件。
对于IIS版本,至少要在6.0以上,IIS5.0存在严重的安全漏洞,不过现在运行IIS5.0的服务器已经非常少了,对于这一点不用太过担心。

删除默认网站

把IIS默认安装的站点删除或禁用掉

禁用不必要的Web服务扩展

打开IIS 管理器看是否有不必要的“Web服务扩展”,如果有则禁用掉。,检查是

删除不使用的应用程序扩展

在IIS管理器中,右击网站“属性”,点击主目录选项卡,点击“应用程序设置”的配置按钮。
根据网站的实际情况,只保留必要的应用程序扩展,其他的一律删除,尤其是像cer、asa这样极其危险的扩展,而且一般网站也不需要它。

IIS访问权限配置

如果IIS中有多个网站,建议为每个网站配置不同的匿名访问账户。
方法:
a. 新建一个账号,加入Guests组
b. “网站属性”—>“目录安全性”—>“身份验证和访问控制”,把“启用匿名访问”处,用刚新建的账户代替默认账户。

正确设置网站目录的权限和IIS权限

网站分区为NTFS分区。网站目录出system和administrator组有完全控制权限外,其他用户只需要有读取权限。

IIS6管理器中设置:

  • 只选择“读取、记录访问、索引资源”
  • 禁止“写入”和“脚本资源访问”,避免IIS Put上传攻击。
  • 禁止“目录浏览”,避免目录遍历攻击。

正确设置网站目录的权限和IIS权限

应用程序设置中的执行权限设置为“纯脚本”

原则

  • 目录有写入权限,一定不要分配执行权限
  • 目录有执行权限,一定不要分配写入权限
  • 网站上传目录和数据库目录一般需要分配“写入”权限,但一定不要分配执行权限
  • 其他目录一般只分配“读取”和“记录访问”权限即可。

设置IP访问限制

正确设置IIS日志

在IIS管理器中,右击网站“属性”,点击网站选项卡,确定已经选择“启用日志记录”,活动日志格式为“W3C扩充日志文件格式”

接着修改IIS日志文件保存路径,默认保存在“C:\\WINDOWS\\system32\\LogFiles”目录下,这里修改为自定义路径。

建议保存在非系统盘路径,并且IIS日志文件所在目录只允许Administrators组用户和SYSTEM用户访问。

自定义IIS返回的错误信息

禁止向客户端发送详细的ASP错误信息

在IIS管理器中—>“属性”—>“主目录”—>“配置”—>“调试”,选择“向客户端发送下列文本错误消息”项,自定义出错时返回的错误信息

Apache安全加固

隐藏Apache banner信息

vim /etc/httpd/conf/httpd.conf
#在出现错误页的时候不显示服务器操作系统的名称
ServerTokens OS  修改为:ServerTokens Prod 
#不回显apache版本信息
ServerSignature On 	修改为:ServerSignature Off 

禁止目录浏览

Options Indexes FollowSymLinks
修改为:

vim /etc/httpd/conf/httpd.conf
Options  FollowSymLinks

限制IP访问

<Directory "/var/www/html/aa/">
    Options Indexes MultiViews FollowSymLinks
    AllowOverride AuthConfig
    AuthType Basic
    AuthName "testuser's paasword"
    AuthUserFile /usr/local/etc/passwd.httpd
    Require user testuser
    Order allow,deny
    Allow from 172.16.1.0
</Directory>
service httpd restart
停止 httpd:[确定]
启动 httpd:[确定]

限制禁止访问的文件夹,例如后台目录

<Directory "/var/www/html/33">     
        Deny from all     
</Directory> 

防止Apache的解析漏洞

Apache对于文件名的解析是从后往前解析的,直到遇见一个它认识的文件类型为止,因此;如果web目录下存在以类似webshell.php.test这样格式命名的文件,Apache在解析时因为不认识.test这个文件类型,所以会一直往前解析,当解析到.php时,它认识了,因此会将它解析为PHP文件。

Apache的这种解析特性经常被用来绕过Web应用的文件上传检测。当Web应用的文件上传功能在检测上传文件的合法性时,如果仅通过检测上传文件的扩展名来判断文件是否合法,就可以利用Apache的这种文件名解析特征绕过Web应用的检测。

禁止httpd解析文件

禁止httpd解析index.php.jpg文件

可以在httpd.conf配置文件中添加以下内容来阻止Apache解析这种文件。
修改后配置:

<FilesMatch \\.php$>
    SetHandler application/x-httpd-php
</FilesMatch>
<FilesMatch "\\.phps$">
    SetHandler application/x-httpd-php-source
</FilesMatch>

错误页面重定向

在.htaccess 文件中加入如下内容即可:

ErrorDocument 400 /custom400.html
ErrorDocument 401 /custom401.html
ErrorDocument 403 /custom403.html
ErrorDocument 404 /custom404.html
ErrorDocument 405 /custom405.html
ErrorDocument 500 /custom500.html Customxxx.html 为要设置的错误页面。

重新启动 Apache 服务生效

日志设置

编辑 httpd.conf 配置文件,设置日志记录文件、记录内容、记录 格式。其中,错误日志:

LogLevel notice				#日志的级别
ErrorLog  logs/error_log 	#日志的保存位置(错误日志)

访问日志:

LogFormat %h %l %u %t \\”%r\\” %>s %b “%Accepti\\”%Refereri\\” \\”%User-Agenti\\””
combined
CustomLog  logs/access_log combined (访问日志)

在Apache httpd 中将在这个文件中存放诊断信息和处理请求中出现的错误。 若要将错误日志送到 Syslog,则设置: ErrorLog syslog。
CustomLog 指令设置访问日志的文件名和位置。 访问日志中会记录服务器所处理的所有请求。

LogFormat 设置日志格式。 LogLevel 用于调整记录在错误日志中的信息的详细程度,建议设置为 noti判定条件
查看 logs 目录中相关日志文件内容,记录完整。

拒绝服务防范

根据业务需要,合理设置 session 时间,防止拒绝服务攻击

vim httpd.conf 配置文件

Timeout 10 		#客户端与服务器端建立连接前的时间间隔
KeepAlive On
KeepAliveTimeout 15 #限制每个 session 的保持时间是 15 秒 

注:此处为一建议值,具体的设定需要根据现实情况。

禁用CGI

如果服务器上不需要运行 CGI 程序,建议禁用 CGI
修改配置vim /etc/httpd/conf/httpd.conf,把 cgi-bin 目录的配置和模块都注释掉

#LoadModule cgi_module modules/mod_cgi.so
#ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
#<Directory "/var/www/cgi-bin">
AllowOverride None
#    Options None 
#    Order allow,deny
#    Allow from all
#</Directory>

防止SQL注入及远程包含

SQL注入是非常危险的问题,小则网站后台被入侵,重则整个服务器沦陷,所以一定要小心。

php.ini中有一个设置:

magic_quotes_gpc = Off	改为     magic_quotes_gpc = On

在远程文件包含漏洞中,攻击者可以通过访问外部地址来加载远程代码,所以一定要设置:

allow_url_fopen = off

nginx服务器安全加固

禁用autoindex

确保nginx.conf配置文件上禁用autoindex,即autoindex off或者没有配置autoindex

关闭服务器标记

如果开启的话(默认情况下)所有的错误页面都会显示服务器的版本和信息。nginx.conf配置如下:

http
    include       naxsi_core.rules;
    include      mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    server_tokens off;
... ...

同时修改/usr/local/nginx/conf/fastcgi_params
将里面的
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
修改为:
fastcgi_param SERVER_SOFTWARE nginx;

自定义缓存

设置自定义缓存以限制缓冲区溢出攻击。nginx.conf配置如下:

http
    ... ...
    server
        ... ...
        client_body_buffer_size  16K;
       client_header_buffer_size  1k;
        client_max_body_size  1m;
       large_client_header_buffers  4  8k;

注:上述的参数不是最优参数,仅供参考。

timeout设置

设置timeout设低来防御DOS攻击,nginx.conf配置如下:

http 
    ... ...
       client_body_timeout   10;
       client_header_timeout  30;
       keepalive_timeout     30  30;
       send_timeout          10;

配置日志

鉴于日志的输出格式还未确定,目前暂时先使用Nginx默认的日志格式nginx.conf配置如下:

http 
    ......
    log_format  main  '$remote_addr - $remote_user [$time_local]"$request" ''$status $body_bytes_sent "$http_referer"''"$http_user_agent" "$http_x_forwarded_for"';
    access_log logs/ access.log  main;

限制访问

在目前的应用系统中值使用到POST和GET方法,所以除了它们之外,其他方式的请求均可拒绝。

Nginx.conf配置如下:

server
       ... ...
       if($request_method !~ ^(GET|HEAD|POST)$)         
                     return404;
              
       ... ...

限制访问IP

模块 ngx_http_access_module 允许限制某些IP地址的客户端访问。
如下范例:

location/ 
    deny  192.168.1.1;
    allow 192.168.1.0/24;
    allow 10.1.1.0/16;
    allow 2001:0db8::/32;
    deny  all;

注:规则按照顺序依次检测,直到匹配到第一条规则。

在这个例子里,IPv4的网络中只有 10.1.1.0/16 和 192.168.1.0/24允许访问,但 192.168.1.1除外

对于IPv6的网络,只有2001:0db8::/32允许访问。

集成Naxsi模块

Naxsi模块是一个开放源代码、高效、低维护规则的Nginx web应用防火墙模块。Naxsi的主要目标是加固web应用程序,以抵御SQL注入、跨站脚本、跨域伪造请求、本地和远程文件包含漏洞。
第一步:下载naxsi
https://github.com/nbs-system/naxsi
注:如果不能上网可以事先下载,再上传到服务器中。

开源waf首选,怎么配置和使用,网络教程铺天盖地,这里就不造轮子啦

数据库加固

Mysql数据库安全加固

删除默认数据库和数据库用户

MySQL初始化后会自动生成空用户和test库,进行安装的测试,这会对数据库的安全构成威胁,有必要全部删除,最后的状态只保留单个root即可,当然以后根据需要增加用户和数据库。

mysql> show databases;
mysql> drop database test; 		#删除数据库test
mysql> use mysql;
mysql> delete from db;          #删除存放数据库的表信息,因为还没有数据库信息。
mysql> delete from user where not (user='root');       #删除初始非root的用户
mysql> delete from user where user='root' and password=''; #删除空密码的root尽量重复操作
mysql> flush privileges; 		#强制刷新内存授权表。

不使用默认密码和弱口令

检查账户默认密码和弱口令,口令长度至少8位,并包括数字、小写字母、大写字母和特殊符号四类中至少两种。且5次以内不得设置相同的口令,密码应至少90天更换一次。

Mysql> Update user set password=password(‘test!p3’) where user=‘root’;
Mysql> Flush privileges;

检测操作
检查本地密码: (注意,管理帐号 root 默认是空密码)

mysql> use mysql;
mysql> select Host,User,Password,Select_priv,Grant_priv from user; 

改变默认mysql管理员帐号

改变默认的mysql管理员账号也可以使mysql数据库的安全性有较好的提高,因为默认的mysql管理员的用户名都是root

mysql> update mysql.user set user='admin' where user='root';

使用独立用户运行MySQL

绝对不要作为使用root用户运行MySQL服务器。这样做非常危险,因为任何具有FILE权限的用户能够用root创建文件(例如,~root/.bashrc)。mysqld拒绝使用root运行,除非使用–user=root选项明显指定。应该用普通非特权用户运行 mysql。为数据库建立独立的linux中的mysql账户,该账户用来只用于管理和运行MySQL。

要想用其它linux用户启动mysql,增加user选项指定/etc/my.cnf选项文件或服务器数据目录的my.cnf选项文件中的[mysqld]组的用户名。

vi /etc/my.cnf
[mysqld]
user=mysql

该命令使服务器用指定的用户来启动,无论你手动启动或通过mysqld_safemysql.server启动,都能确保使用mysql的身份。

禁止远程连接数据库

使用命令netstat 查看默认的3306端口是打开的,此时打开了mysql的网络监听,允许用户远程通过帐号密码连接数本地据库,默认情况是允许远程连接数据的。为了禁止该功能,启动skip-networking,不监听sql的任何TCP/IP的连接,切断远程访问的权利,保证安全性。

vi /etc/my.cf       #将#skip-networking注释去掉

限制用户连接的数量

数据库的某用户多次远程连接,会导致性能的下降和影响其他用户的操作,有必要对其进行限制。可以通过限制单个账户允许的连接数量来实现,设置my.cnf 文件的mysql中的max_user_connections变量来完成。GRANT语句也可以支持资源控制选项来限制服务器对一个账户允许的使用范围。

vi /etc/my.cnf
[mysqld]
max_user_connections=2

命令历史记录保护

数据库相关的shell操作命令都会分别记录在.bash_history,如果这些文件不慎被读取,会导致数据库密码和数据库结构等信息泄露,而登陆数据库后的操作将记录在.mysql_history文件中,如果使用update表信息来修改数据库用户密码的话,也会被读取密码,因此需要删除这两个文件,同时在进行登陆或备份数据库等与密码相关操作时,应该使用-p参数加入提示输入密码后,隐式输入密码,建议将以上文件置空。

rm .bash_history .mysql_history	#删除历史记录
ln -s /dev/null .bash_history   #将shell记录文件置空
ln -s /dev/null .mysql_history	#将mysql记录文件置空

对重要数据加密存储

MySQL提供了4个函数用于哈希加密:PASSWORD, ENCRYPT, SHA1和MD5。
INSERT INTO table1 (user, password) VALUE (‘user1’, MD5(‘password1’) )

本地文件读取保护

常见攻击:拥有FILE权限

create dababase use;
CREATE TABLE etc_passwd (pwd_entry TEXT);
LOAD DATA INFILE "/etc/passwd" into TABLE etc_passwd;
SELECT * FROM etc_passwd;

防止用户使用LOAD DATA LOCAL INFILE读取服务器上的本地文件设置

vim /etc/my.cnf
set-variable=local-infile=0

日志功能

mysql 有以下几种日志:

错误日志: -log-err
查询日志: -log (可选)
慢查询日志: -log-slow-queries (可选)
更新日志: -log-update
二进制日志: -log-bin

在 mysql 的安装目录下,打开 my.ini 在后面加上上面的参数,保存后重启mysql 服务就行了

检查操作
查看etc/my.cnf文件,查看是否包含如下配置:

[mysqld]
Log=filename

数据库的恢复

mysql -u root -p [数据库名] < /备份路径/备份文件名

Sqlserver数据库安全加固

密码策略和弱口令

对用户的属性进行安全检查,包括空密码、密码更新时间等。修改目前所有账号的口令,确保口令达到至少12位长度,包括数字、字母、符号混排,无规律的方式,并且不使用默认的win密码。

具体操作

打开SQL Server Management Studio管理界面,在左侧展开“登录名”,对 sa和其它登录名逐一右键点击查看属性,勾选“强制实施密码策略”。

通讯协议加密

当对服务器进行远程管理时,防止鉴别信息在网络传输过程中被窃听,应使用加密通讯协议,提高安全性。

具体操作

SQL Server配置管理器>>SQL Server网络配置>>MSSQLSERVER的协议,右键点击>>属性>>标志
把“强行加密”(ForceEncryption)设为“是”。

限制guest账户对数据库的访问

取消guest账户对master和tempdb之外的数据库的访问权限。

  • 方法一:打SQL Server管理界面,在左侧展开除了master和tempdb之外的所有数据库>>安全性>>用户,删除guest账户。
  • 方法二:用命令去除guest账户对指定数据库的访问权限:
    use 数据库名
    exec sp_revokedbaccess guest

设置身份认证

应实现操作系统和数据库系统特权用户的权限分离,防止操作系统用户对SQL Server数据库进行非授权管理。

具体操作

  • 展开服务器组,右键单击服务器->在弹出的右键菜单中单击“属性”,在“安全性”选项卡中选择“服务器身份验证”认证方式为“SQL Server和Windows身份验证模式”。
  • 在“SQL Server管理器”-〉“安全性”中,选择账号“BUILTIN\\Administrators”,右击选择“属性”,更改“状态”设置“拒绝允许连接到数据库引擎”和“禁用登录”。

开启日志审计

数据库应配置日志功能,对用户登录进行记录,记录内容包括用户登录使用的账号、登录是否成功、登录时间以及远程登录时用户使用的IP 地址。

具体操作

  • 在“SQL Server管理器”->右键单击服务器->单击“属性”->“安全性”,选择每个登录的“审核级别”为“失败和成功的登录”。
  • 询问数据库管理员,是否采取第三方工具或其他措施增强SQL Server的日志功能,如果有则查看这些工具记录的审计记录是否符合等级保护的安全审计要求。

设置连接协议和监听的IP范围

设定SQL Server允许的连接协议,以及TCP/IP协议中监听端口时绑定的IP地址,限制不必要的远程客户端访问到数据库资源。

具体操作

  • 从开始菜单打开SQL Server配置管理器,展开“SQL SERVER 2008网络配置>>SQL SERVER的协议,在右侧将不需要的协议禁用,如:VIA和Share Memory方式可能一般不需要使用。
  • 在以上界面双击“TCP/IP”协议>>IP地址,如有不必要监听的IP项,则把“活动”属性设置为“否”。如:访问数据库的应用程序也装在该服务器上,则只需要监听127.0.0.1即可,其它IP不需要监听。在应用程序中配置为使用127.0.0.1访问数据库。

根据安全策略设置登录终端的操作超时锁定。

  • 从开始菜单打开SQL Server管理界面,再展开菜单栏的“工具”>>“选项”>>“设计器”>>“Analysis Services设计器”,在“连接”下的“连接超时值”输入合适的数字(默认值15)。
  • 在SQL Server管理界面左侧,右键点击服务器名称>>属性>>高级,在右侧找到“远程登录超时值”,设置为合适的数字,
    选项—连接属性—将连接超时值设置为一个较大的数字(默认值20)。

隐藏实例

防止数据库系统的相关信息泄露

具体操作

  • 在SQL Server配置管理器中选择“SQL Server 网络配置”中的“MSSQLSERVER的协议”,右键选择“属性”,选中其中的“隐藏实例”选项。

修改默认端口

修改默认通信端口,防止攻击者通过1433登录数据库服务器。

具体操作:

  • 在SQL Server配置管理器中选择“SQL Server 2005网络配置”中的“MSSQLSERVER的协议”,选中“TCP/IP”,右键选择“属性”,在TCP/IP属性对话框,选择“IP地址”选项卡。
  • 修改所有“TCP端口”右边的文本栏为新的要修改的端口号(默认端口号为1433),然后重启SQL Server生效。

关于安全加固的知识点就总结到这里,本文可能实际上没有啥技术含量,但是写起来还是比较耗费时间的,在这个喧嚣浮躁的时代,个人博客越来越没有人看了,写博客感觉一直是用爱发电的状态。如果你恰巧财力雄厚,感觉本文对你有所帮助的话,可以考虑打赏一下本文!
“拒绝允许连接到数据库引擎”和“禁用登录”。

开启日志审计

数据库应配置日志功能,对用户登录进行记录,记录内容包括用户登录使用的账号、登录是否成功、登录时间以及远程登录时用户使用的IP 地址。

具体操作

  • 在“SQL Server管理器”->右键单击服务器->单击“属性”->“安全性”,选择每个登录的“审核级别”为“失败和成功的登录”。
  • 询问数据库管理员,是否采取第三方工具或其他措施增强SQL Server的日志功能,如果有则查看这些工具记录的审计记录是否符合等级保护的安全审计要求。

设置连接协议和监听的IP范围

设定SQL Server允许的连接协议,以及TCP/IP协议中监听端口时绑定的IP地址,限制不必要的远程客户端访问到数据库资源。

具体操作

  • 从开始菜单

    性能环境之docker操作指南3(全网最全)

    docker run

    1. Usage: docker run [OPTIONS] IMAGE [COMMAND][ARG...]


    -a

    1. -a,--attach=[]Attach to STDIN, STDOUT or STDERR


    如果在执行run命令时没有指定-a,那么docker默认会挂载所有标准数据流,包括输入输出和错误。你可以特别指定挂载哪个标准流。

    1. $ docker run -a stdin -a stdout -i -t ubuntu:14.04/bin/bash
    2. (只挂载标准输入输出)


    --add-host

    1. --add-host=[]Add a custom host-to-IP mapping (host:ip)


    添加host-ip到容器的hosts文件

    1. $ docker run -it --add-host db:192.168.1.1 ubuntu:14.04/bin/bash
    2. root@70887853379d:/# cat /etc/hosts
    3. 172.17.0.270887853379d
    4. 127.0.0.1 localhost
    5. ::1 localhost ip6-localhost ip6-loopback
    6. fe00::0 ip6-localnet
    7. ff00::0 ip6-mcastprefix
    8. ff02::1 ip6-allnodes
    9. ff02::2 ip6-allrouters
    10. 192.168.1.1 db


    --blkio-weight

    1. --blkio-weight=0Block IO (relative weight), between 10 and 1000


    相对于CPU和内存的配额控制,docker对磁盘IO的控制相对不成熟,大多数都必须在有宿主机设备的情况下使用。主要包括以下参数:

    • device-read-bps:限制此设备上的读速度(bytes per second),单位可以是kb、mb或者gb.
    • -device-read-iops:通过每秒读IO次数来限制指定设备的读速度。
    • –device-write-bps :限制此设备上的写速度(bytes per second),单位可以是kb、mb或者gb。
    • –device-write-iops:通过每秒写IO次数来限制指定设备的写速度。
    • –blkio-weight:容器默认磁盘IO的加权值,有效值范围为10-100。
    • –blkio-weight-device: 针对特定设备的IO加权控制。其格式为DEVICE_NAME:WEIGHT
      存储配额控制的相关参数,可以参考Red Hat文档中blkio这一章,了解它们的详细作用。

    磁盘IO配额控制示例
    blkio-weight
    要使–blkio-weight生效,需要保证IO的调度算法为CFQ。可以使用下面的方式查看:

    1. root@ubuntu:~# cat /sys/block/sda/queue/scheduler
    2. noop [deadline] cfq


    使用下面的命令创建两个–blkio-weight值不同的容器:

    1. $ docker run -ti –rm –blkio-weight 100 ubuntu:stress
    2. $ docker run -ti –rm –blkio-weight 1000 ubuntu:stress


    在容器中同时执行下面的dd命令,进行测试:

    1. time dd if=/dev/zero of=test.out bs=1M count=1024 oflag=direct


    device-write-bps
    使用下面的命令创建容器,并执行命令验证写速度的限制。

    1. $ docker run -tid –name disk1 –device-write-bps /dev/sda:1mb ubuntu:stress


    容器空间大小限制
    在docker使用devicemapper作为存储驱动时,默认每个容器和镜像的最大大小为10G。如果需要调整,可以在daemon启动参数中,使用dm.basesize来指定,但需要注意的是,修改这个值,不仅仅需要重启docker daemon服务,还会导致宿主机上的所有本地镜像和容器都被清理掉。
    使用aufs或者overlay等其他存储驱动时,没有这个限制。
    --cidfile=

    1. --cidfile=Write the container ID to the file


    将container ID保存到cid_file, 保存的格式为长UUID

    1. $ docker run -it --cidfile=cid_file ubuntu:14.04/bin/bash
    2. #cat cid_file
    3. 5fcf835f2688844d1370e6775247c35c9d36d47061c4fc73e328f9ebf920b402


    --cpu-shares

    1. --cpu-shares=0 CPU shares (relative weight)


    默认情况下,使用-c或者--cpu-shares 参数值为0,可以赋予当前活动container 1024个cpu共享周期。这个0值可以针对活动的container进行修改来调整不同的cpu循环周期。
    比如,我们使用-c或者--cpu-shares =0启动了C0,C1,C2三个container,使用-c/--cpu-shares=512启动了C3.这时,C0,C1,C2可以100%的使用CPU资源(1024),但C3只能使用50%的CPU资源(512)。如果这个host的OS是时序调度类型的,每个CPU时间片是100微秒,那么C0,C1,C2将完全使用掉这100微秒,而C3只能使用50微秒。
    --cpu-period, --cpu-quota

    1. --cpu-period=0Limit CPU CFS (CompletelyFairScheduler) period
    2. --cpu-quota=0Limit CPU CFS (CompletelyFairScheduler) quota


    --cpu-period和--cpu-quota,这两个参数是相互配合的,--cpu-period和--cpu-quota的这种配置叫 Ceiling Enforcement Tunable Parameters,--cpu-shares的这种配置叫Relative Shares Tunable Parameters。--cpu-period是用来指定容器对CPU的使用要在多长时间内做一次重新分配,而--cpu-quota是用来指定在这个周期内,最多可以有多少时间用来跑这个容器。跟--cpu-shares不同的是这种配置是指定一个绝对值,而且没有弹性在里面,容器对CPU资源的使用绝对不会超过配置的值。
    比如说A容器配置的--cpu-period=100000 --cpu-quota=50000,那么A容器就可以最多使用50%个CPU资源,如果配置的--cpu-quota=200000,那就可以使用200%个CPU资源。
    那么有什么样的应用场景呢?简单举个例子,加入对外提供A和B两个服务,但是A的优先级比B要高,假如只用--cpu-shares来配置,B服务占用资源太高时是会对A有一定的影响的,但是如果通过--cpu-period和--cpu-quota来配置,就能起到绝对的控制,做到无论B怎么样,都不会影响到A。
    cpu-period和cpu-quota的单位为微秒(μs)。cpu-period的最小值为1000微秒,最大值为1秒(10^6 μs),默认值为0.1秒(100000 μs)。cpu-quota的值默认为-1,表示不做控制。
    --cpuset-cpus, --cpuset-mems

    1. --cpuset-cpus=CPUsin which to allow execution (0-3,0,1)
    2. --cpuset-mems=MEMsin which to allow execution (0-3,0,1)


    对多核CPU的服务器,docker还可以控制容器运行限定使用哪些cpu内核和内存节点,即使用–cpuset-cpus和–cpuset-mems参数。对具有NUMA拓扑(具有多CPU、多内存节点)的服务器尤其有用,可以对需要高性能计算的容器进行性能最优的配置。如果服务器只有一个内存节点,则–cpuset-mems的配置基本上不会有明显效果。
    使用示例:
    命令docker run -tid –name cpu1 –cpuset-cpus 0-2 ubuntu,表示创建的容器只能用0、1、2这三个内核。最终生成的cgroup的cpu内核配置如下:

    1. # cat /sys/fs/cgroup/cpuset/docker/<容器的完整长ID>/cpuset.cpus
    2. 0-2


    通过docker exec <容器ID> taskset -c -p 1(容器内部第一个进程编号一般为1),可以看到容器中进程与CPU内核的绑定关系,可以认为达到了绑定CPU内核的目的。
    -d, --detach

    1. -d,--detach=false Run container in background and print container ID


    如果在docker run 后面追加-d=true或者-d,则containter将会运行在后台模式(Detached mode)。此时所有I/O数据只能通过网络资源或者共享卷组来进行交互。因为container不再监听你执行docker run的这个终端命令行窗口。但你可以通过执行docker attach 来重新挂载这个container里面。需要注意的时,如果你选择执行-d使container进入后台模式,那么将无法配合"--rm"参数。
    --device=

    1. --device=[]Add a host device to the container


    --disable-content-trust

    1. --disable-content-trust=true Skip image verification


    跳过镜像验证。
    --dns

    1. --dns=[]Set custom DNS servers


    自定义DNS.

    1. $ docker run -it --dns=8.8.8.8--rm ubuntu:14.04/bin/bash
    2. root@b7a6f0e63e65:/# cat /etc/resolv.conf
    3. nameserver 8.8.8.8


    --dns-opt

    1. --dns-opt=[]Set DNS options


    --dns-search

    1. --dns-search=[]Set custom DNS search domains


    -e, --env

    1. -e,--env=[]Set environment variables


    自这义环境变量。
    --entrypoint

    1. --entrypoint=Overwrite the default ENTRYPOINT of the image


    字面意思是进入点,而它的功能也恰如其意。
    An ENTRYPOINT allows you to configure a container that will run as an executable.它可以让你的容器功能表现得像一个可执行程序一样。
    示例一:
    使用下面的ENTRYPOINT构造镜像:

    1. ENTRYPOINT ["/bin/echo"]


    那么docker build出来的镜像以后的容器功能就像一个/bin/echo程序:
    比如我build出来的镜像名称叫imageecho,那么我可以这样用它:

    1. docker run -it imageecho “this is a test”


    这里就会输出”this is a test”这串字符,而这个imageecho镜像对应的容器表现出来的功能就像一个echo程序一样。 你添加的参数“this is a test”会添加到ENTRYPOINT后面,就成了这样 /bin/echo “this is a test” 。
    示例二:

    1. ENTRYPOINT ["/bin/cat"]


    构造出来的镜像你可以这样运行(假设名为st):

    1. docker run -it st /etc/fstab


    这样相当: /bin/cat /etc/fstab 这个命令的作用。运行之后就输出/etc/fstab里的内容。
    --env-file

    1. --env-file=[]Readin a file of environment variables


    读取设置环境变量的文件.
    --expose

    1. --expose=[]Expose a port or a range of ports


    告诉Docker服务端容器暴露的端口号,供互联系统使用。

    1. $ docker run -it --expose=22--rm ubuntu:14.04/bin/bash


    --group-add

    1. --group-add=[]Add additional groups to join


    -h, --hostname

    1. -h,--hostname=Container host name


    设置容器主机名。

    1. $ docker run -it --hostname=web --rm ubuntu:14.04/bin/bash
    2. 进入容器后
    3. root@web:/#


    -i, --interactive=false

    1. -i,--interactive=false Keep STDIN open even if not attached


    保持标准输入,常同-t一起使用来申请一个控制台进行数据交互。
    --ipc

    1. --ipc= IPC namespace to use


    IPC(POSIX/SysV IPC)命名空间提供了相互隔离的命名共享内存,信号灯变量和消息队列。
    共享内存可以提高进程数据交互速度。共享内存一般用在database和高性能应用(C/OpenMPI, C++/using boost libraries)上或者金融服务上。如果需要容器里面部署上述类型的应用,那么就应该在多个容器直接采取共享内存了。
    --kernel-memory

    1. --kernel-memory=Kernel memory limit


    内核内存,不会被交换到swap上。一般情况下,不建议修改,可以直接参考docker的官方文档。
    -l, --label

    1. -l,--label=[]Set meta data on a container
    2. --label-file=[]Readin a line delimited file of labels


    --link

    1. --link=[]Add link to another container


    用于连接两个容器。
    示例:连接两个容器
    启动容器1:web

    1. $ docker run --name web -d -p 22-p 80-it webserver:v1


    启动容器2:ap1连接到web,并命名为apache

    1. $ docker run --name ap1 --link=web:apache -d -p 22-p 80-it webserver:v1


    --log-driver

    1. --log-driver=Logging driver for container
    2. --log-opt=[]Log driver options


    Docker增加了对json-file型(默认)log driver的rotate功能,我们可通过max-size和max-file两个–log-opt来配置。比如:我们启动一个nginx容器,采用 json-file日志引擎,每个log文件限制最大为1k,轮转的日志个数为5个:

    1. docker run -d --log-driver=json-file --log-opt max-size=1k--log-opt max-file=5--name webserver -p 9988:80 nginx


    有了rotate,我们就不必担心某个container的日志暴涨而将同host的其他container拖死了。
    --mac-address

    1. --mac-address=Container MAC address


    (e.g. 92:d0:c6:0a:29:33)
    设置容器的mac地址。
    -m, --memory

    1. -m,--memory=Memory limit


    设置容器使用的最大内存上限。默认单位为byte,可以使用K、G、M等带单位的字符串。
    默认情况下,容器可以使用主机上的所有空闲内存。
    设置容器的内存上限,参考命令如下所示:

    1. docker run -tid —name mem1 —memory 128m ubuntu:14.04/bin/bash


    默认情况下,除了–memory指定的内存大小以外,docker还为容器分配了同样大小的swap分区,也就是说,上面的命令创建出的容器实际上最多可以使用256MB内存,而不是128MB内存。如果需要自定义swap分区大小,则可以通过联合使用–memory–swap参数来实现控制。
    对上面的命令创建的容器,可以查看到在cgroups的配置文件中,查看到容器的内存大小为128MB (128×1024×1024=134217728B),内存和swap加起来大小为256MB (256×1024×1024=268435456B)。

    1. #cat /sys/fs/cgroup/memory/docker/<容器的完整ID>/memory.limit_in_bytes
    2. 134217728
    3. #cat /sys/fs/cgroup/memory/docker/<容器的完整ID>/memory.memsw.limit_in_bytes
    4. 268435456


    注意:执行上述命令时,命令行可能会输出下面的警告:
    WARNING: Your kernel does not support swap limit capabilities, memory limited without swap.
    这是因为主机上默认不启用cgroup来控制swap分区,可以参考docker官方的相应文档,修改grub启动参数。
    --memory-reservation

    1. --memory-reservation=Memory soft limit


    启用弹性的内存共享,当宿主机资源充足时,允许容器尽量多地使用内存,当检测到内存竞争或者低内存时,强制将容器的内存降低到memory-reservation所指定的内存大小。按照官方说法,不设置此选项时,有可能出现某些容器长时间占用大量内存,导致性能上的损失。
    --memory-swap

    1. --memory-swap=Total memory (memory + swap),\'-1\' to disable swap


    等于内存和swap分区大小的总和,设置为-1时,表示swap分区的大小是无限的。默认单位为byte,可以使用K、G、M等带单位的字符串。如果–memory-swap的设置值小于–memory的值,则使用默认值,为–memory-swap值的两倍。
    --memory-swappiness

    1. --memory-swappiness=-1Tuning container memory swappiness (0 to 100)


    控制进程将物理内存交换到swap分区的倾向,默认系数为60。系数越小,就越倾向于使用物理内存。值范围为0-100。当值为100时,表示尽量使用swap分区;当值为0时,表示禁用容器 swap 功能(这点不同于宿主机,宿主机 swappiness 设置为 0 也不保证 swap 不会被使用)。
    --name

    1. --name=Assign a name to the container


    为容器指定一个名字。

    1. $ docker run -it --name=web ubuntu:14.04/bin/bash


    --net

    1. --net=default Set the Networkfor the container


    以下是网络设置中常用的参数:

    • none 关闭container内的网络连接:
      将网络模式设置为none时,这个container将不允许访问任何外部router。这个container内部只会有一个loopback接口,而且不存在任何可以访问外部网络的router。
    • bridge 通过veth接口来连接contianer 默认选项:
      Docker默认是将container设置为bridge模式。此时在host上面讲存在一个docker0的网络接口,同时会针对container创建一对veth接口。其中一个veth接口是在host充当网卡桥接作用,另外一个veth接口存在于container的命名空间中,并且指向container的loopback。Docker会自动给这个container分配一个IP,并且将container内的数据通过桥接转发到外部。
    • host 允许container使用host的网络堆栈信息:
      当网络模式设置为host时,这个container将完全共享host的网络堆栈。host所有的网络接口将完全对container开放。container的主机名也会存在于host的hostname中。这时,container所有对外暴露的port和对其它container的link,将完全失效。
    • Container:
      当网络模式设置为Container时,这个container将完全复用另外一个container的网络堆栈。同时使用时这个container的名称必须要符合下面的格式:--net container:.
      比如当前有一个绑定了本地地址localhost的redis container。如果另外一个container需要复用这个网络堆栈,则需要如下操作:
    1. $ docker run -d --name redis example/redis --bind 127.0.0.1
    2. # use the redis container\'s network stack to access localhost
    3. $ sudo docker run --rm -ti --net container:redis example/redis-cli -h 127.0.0.1


    --oom-kill-disable

    1. --oom-kill-disable=false Disable OOM Killer


    -P, --publish-all

    1. -P,--publish-all=false Publish all exposed ports to random ports


    对外映射所有端口。
    -p, --publish

    1. -p,--publish=[]Publish a container\'s port(s) to the host


    对外映射指定端口,如不指定映射后的端口将随机指定。

    1. $ docker run –d -p 10022:22-p 10080:80-it webserver:v1


    使用docker run来启动我们创建的容器。-d让容器以后台方式运行。使用多个-p来映射多个端口,将容器的22端口映射为本地的10022,80映射为10080。
    --pid

    1. --pid= PID namespace to use


    设置容器的PID模式。两种:

    1. host: use the host\'s PID namespace inside the container.
    2. Note: the host mode gives the container full access to local PID and is therefore considered insecure.


    --privileged

    1. --privileged=false Give extended privileges to this container


    默认情况下container是不能访问任何其他设备的。但是通过"privileged",container就拥有了访问任何其他设备的权限。
    当操作者执行docker run --privileged时,Docker将拥有访问host所有设备的权限

    1. $ docker run -it --rm --privileged ubuntu:14.04/bin/bash


    --read-only

    1. --read-only=false Mount the container\'s root filesystem as read only


    启用后,容器的文件系统将为只读。

    1. $ docker run -it --rm --read-only ubuntu:14.04/bin/bash
    2. root@d793e24f0af1:/# touch a
    3. touch: cannot touch \'a\':Read-only file system

     

    • no,默认策略,在容器退出时不重启容器
    • on-failure,在容器非正常退出时(退出状态非0),才会重启容器
    • on-failure:3,在容器非正常退出时重启容器,最多重启3次
    • always,在容器退出时总是重启容器,当操作系统或docker服务重启时,该容器总能随系统启动
    • unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器

    示例:

    1. $ docker run -it --restart=always ubuntu:14.04/bin/bash


    --rm

    1. --rm=false Automatically remove the container when it exits


    当容器退出时,清除所有该容器的信息。
    --security-opt

    1. --security-opt=[]SecurityOptions


    安全选项。
    --sig-proxy

    1. --sig-proxy=true|false
    2. Proxy received signals to the process (non-TTY mode only). SIGCHLD, SIGSTOP, and SIGKILL are not proxied.The default is true.


    --stop-signal

    1. --stop-signal=SIGTERM Signal to stop a container, SIGTERM by default


    -t, --tty

    1. -t,--tty=false Allocate a pseudo-TTY


    分配一个模拟终端,常和-i一块使用.
    -u, --user

    1. -u,--user=Username or UID (format:<name|uid>[:<group|gid>])
    2. Sets the username or UID used and optionally the groupname or GID for the specified command.
    3. The followings examples are all valid:
    4. --user [user | user:group | uid | uid:gid | user:gid | uid:group ]
    5. Without this argument the command will be run as root in the container.


    --ulimit

    1. --ulimit=[]Ulimit options
    2. --default-ulimit,docker daemon的启动参数,能够指定默认container ulimit配置。如果此参数没配置,则默认从docker daemon继承;
    3. --ulimit,docker run的参数,能够覆盖docker daemon指定的ulimit默认值。如果此参数没配置,则默认从default-ulimit继承;

     

    1. $ docker run -it -d --ulimit nofile=20480:40960 ubuntu:14.04/bin/bash


    -v, --volume

    1. -v,--volume=[]Bind mount a volume


    可以使用带有 -v 参数的 docker run 命令给容器添加一个数据卷.
    1.添加数据卷/data1,会自动创建目录

    1. $ docker run -it --name web -v /data1 ubuntu:14.04/bin/bash
    2. root@fac11d44de3e:/# df -h
    3. /dev/disk/by-uuid/1894172f-589b-4e8b-b763-7126991c7fbb29G2.6G25G10%/data1
    4. root@fac11d44de3e:/# cd /data1


    2.将宿主机的目录添加到容器
    将宿主机的/data_web加载为容器/data目录

    1. $ docker run -it --name web -v /data_web:/data ubuntu:14.04/bin/bash


    --volumes-from

    1. --volumes-from=[]Mount volumes from the specified container(s)


    从其他容器挂载目录。
    1.创建dbdata容器,并含有/data数据卷

    1. $ docker run -it -v /data --name dbdata ubuntu:14.04/bin/bash


    2.创建webserver1挂载dbdata的数据卷

    1. $ docker run -it --volumes-from dbdata --name webserver1 ubuntu:14.04/bin/bash


    -w, --workdir

    1. -w,--workdir=Working directory inside the container


    设置容器的工作目录。

    1. $ docker run -it --workdir="/data" ubuntu:14.04/bin/bash
    2. root@7868da4d2846:/data#



    未完待续......

    以上是关于全网最全安全加固指南的主要内容,如果未能解决你的问题,请参考以下文章

    最实用的Windows安全加固手册

    Linux服务器通用安全加固指南

    HW Tomcat系统安全加固规范

    Linux服务器通用安全加固指南

    如何用安全策略加固无线局域网安全

    Linux服务器通用安全加固指南