# 安全攻防技能-安全基础概念
Date: 2020-06-20


## 相关概念

- `cybersecurity`: `网络空间安全`涉及旨在保护设备，网络，程序和数据免受攻击和未经授权的访问的一系列实践，流程和技术; 网络安全不仅可以保护数据，还可以保护存储数据的资源和技术。
    
- `information security`: `信息安全`是关于保护信息的，通常集中在信息的机密性，完整性和可用性方面。
    

`cyberseurity`应用于信息技术的安全，wiki上的 [Cybersecurity information technology list](https://en.wikipedia.org/wiki/Cybersecurity_information_technology_list) 几乎列出了wiki上所有网域安全相关信息

> wiki相关主题，关于英文的关键字是 `Information security`, `cybersecurity`，`cyberspace`, 后两者者常用户的翻译是`网络空间安全`, `网络空间`。现在的安全相关相关信息用后者搜索到的信息更新一些.

## 基本原则

### 安全三元组

CIA triad: Confidentiality, Integrity, Availability

- Confidentiality
    
    机密性, 隐私信息, 防止被他人看到，保证机密性的例子如在线支付，涉及的用户信息，密码保护等等。
    
- Integrity
    
    完整性, 数据一致、准确、可信的, 不会在传输过程中改变，保证完整性的例子如用户访问控制，文件权限; 版本控制（防止已授权用户误操作）; 为了检测由于故障可能发生的数据变化，一些数据设置了校验和， 验证数据完整性。必须有冗余和备份才能将受影响的数据还原成正常状态。
    
- Availabilty
    
    可用性: 保障数据能够被正常访问。保证可用性的例子，比如磁盘的RAID, 应用集群，机房建设，同城异地灾备，通信线路选取多家运营商等等 。
    

### 面临挑战

- 大数据
    
    由于要保护的数据信息量巨大，考虑到冗余和备份, 数据保存的成本会成倍增加。此外，由于大数据更关注于数据收集和对用户信息、行为的分析和理解, 通常缺乏数据监管。比如 `Whistleblower Edward Snowden`
    
- 物联网
    
    物联网中实体和对象会有一个唯一标识符，并且具有网络通讯能力，单个接入设备可能不会引起任何隐私问题， 但是当整理和分析来自多个终端的数据时， 可能就会产生敏感数据。涉及领域如智能玩具，智能家居，智能医疗。 而且物联网设备通常不会经常打补丁，并且会使用默认密码或弱密码及进行配置,如不加保护很可能成为黑客用于攻击的载体。
    

## 解决方案

### 黄金法则: Authentication, Authorization, Audit

`黄金法则`是系统安全设计的指导规范，是用户在访问使用系统过程中, 应考虑的最基本的安全设计要求。

- Authentication
    
    身份认证和识别， 软件系统常用的就是用户, 密码，为了加强强度，后续又增加了多因素认证， 一般是双因素认证(2FA)
    
- Authorization
    
    授权确定能再系统中使用资源的范围
    
- Audit
    
    通过日志还原用户的操作,一般是出现问题后的一种防御措施.
    

### 安全最佳实践

- 设立专门防止内部威胁的职位
- 进行网络钓鱼模拟
- 确保员工远程访问安全
- 优先员工的隐私
- 进行安全相关培训
- 外包厂商应遵守相同的安全策略并接收培训
- 建立使用适合的信息安全框架(ISO/IEC27001)
- 监控用户和文件防止数据丢失
- 高价值行业（医疗，技术，银行）应防范更高层次的威胁
- 加强用户密码管理使用SSO，MFAs
- 特权用户审计
- 控制访问权限防止数据泄露
- 检测内部威胁
- 备份数据
- 雇佣合同，第三方外包时合同中应写明相关的保密条款
- 更新定期更新软件和使用系统
- 指定安全时间响应预案， 定期进行演练
- 定期进行安全培训及演练
- 合规要求：**HIPAA, PCI, ISO, and DSS**
- 在使用软件,组件之前应考虑相关安全性
- 指定标准人事流程防止人员离职到的数据流失
- 可以持续监控用户活动
- 自动化减少认为操作的错误
- **GDPR**合规要求
- 使用https提供服务

> `best practices` 通过这个关键字搜索的一些信息, 参见文末链接`19 Cybersecurity Best Practices to Protect Your Business`

## 密码学基础

### 密码学算法

- 对称加密算法: DES, IDEA, AES, SM1, SM4
    
    ECB/CBC/CFB/OFB/CTR
    

DES CTR加密模式的例子

```python
[root@centosgpt python]# cat desctr.py
from Crypto.Cipher import DES
from Crypto.Random.random import Random
from Crypto.Util import Counter

def encrypt_des_ctr(plaintext):
    if plaintext is None:
        return
    try:
        key = b'1234A#CD'
        nonce = b'0000'
        ctr = Counter.new(32, prefix=nonce)

        generator = DES.new(key, DES.MODE_CTR, counter=ctr)
        #generator = DES.new(key, DES.MODE_CTR, nonce=nonce)

        pad = 8 - len(plaintext) % 8
        pad_str = ""
        for i in range(pad):
            pad_str = pad_str + chr(0)
        pad_bytes = pad_str.encode()

        encrypted = generator.encrypt(plaintext + pad_bytes)
        result = encrypted.hex()
        print ("plaintext:" +str(plaintext)+ "  encrypted:" + str(result))
        return result

    except (ValueError, KeyError):
        print (Exception)
        return

encrypt_des_ctr(b'1234567890')
```

代码是参考 [Python使用Crypto/pyDes,DES并Base64编码](https://www.jianshu.com/p/9b7de5ec8b4c) , 可以看到下面两行, 选用是同样加密模式如果相关参数设置不同，加密结果也不一样。

```python
  generator = DES.new(key, DES.MODE_CTR, counter=ctr)
  #generator = DES.new(key, DES.MODE_CTR, nonce=nonce)
```

- 非对称加密算法: RSA, ECC, SM2
    
- 散列算法: MD5, SHA, SM3
    

### 应用实践

1. 实际使用加密算法除了长度参数, 还要关注加密模式，如对称加密钥模式， 填充算法， 以及初始向量的设置， 尤其是如果与外围系统信息交互时， 除了明确通讯协议，数据编码外, 需要明确相关加密参数。
    
2. 使用已有的加密,哈希算法不要自己创造
    

## 身份认证

### 身份认证面临威胁

- 没有认证环节
    
- 弱密码
    
- 认证信息泄露
    

### 身份认证安全保证

- 安全规范:
    
    安全规范主要包括管理制度规范和应用开发规范，针对不同场景的应用开发需要有不同等级的安全要求，区分内网和互联网应用(当然前提是做好了内外网的隔离)， 这样减少的安全方面过度的设计。
    
- 密码安全：
    
    - 密码哈希： 基于hash的账号, Hash算法不可逆，输入的变化一点，输出结果将完全不同;
        
    - 哈希破解:
        
    - 字典攻击和暴力破解
        
    - 查找表
    - 反向查表法
    - 彩虹表
        
    - 密码加盐: 查找表和彩虹表能够工作是因为每个密码都进行相同的哈希处理,每次哈希加入随机数可以阻止这种攻击。
        
    - 密码加盐误区:
        
    - 盐值复用
        
    - 盐值较短
    - 双重盐值和组合hash
        
        - md5(sha1(password))
        - md5(md5(salt) + md5(password))
        - sha1(sha1(password))
        - sha1(str\_rot13(password + salt))
        - md5(sha1(md5(md5(password) + sha1(password)) + md5(password)))
    - 哈希碰撞 是指不同的输入，输出的哈希值一样， 如MD5， 这种情况下要选择更加安全的算法 SHA256, SHA512, RipeMD, or WHIRLPOOL
        
    - 盐值哈希的基本处理步骤
        
    - 存储密码
        
        - 生成随机数
        - 将盐值混入密码及及进行哈希运算
        - 将盐值和哈希一起存入用户数据库
    - 校验密码
        
        - 数据库检索出用户的盐值和哈希值
        - 将盐值混入密码, 进行哈希运算
        - 上一步结果与数据库的哈希值比较
    - 在服务端进行哈希
        
        客户端角度， 逻辑上哈希后的密钥就是密码。一旦数据库用户信息泄露，就可以随意使用每个人的账户登录。
        
    - 慢哈希函数
        
        bcrypt, pbkdf2, SCrypt, Argon2, Argon2id, 升级算法。 通过采取安全因子或迭代次数, 使得运算足够的慢而不影响应用。
        
    - 密钥希函及密码哈希硬件
        
    
    使用密钥加密哈希值， 更安全的方式是将密钥存储在硬件设备中如： `YubiHSM`
    
    另外，密码保护仅仅是再系统收到攻击时保护密码，要提升应用安全是远远不够的， [OWASP Top Ten](https://owasp.org/www-project-top-ten/)是比较好的参考。
    
- 图形验证: 防止短信风暴
    
- 客户预留信息: 客户在应用系统中记录一段信息， 在客户登录时显示出来
    
- 多因素认证: 认证方式: 短信验证码，邮件验证, google身份验证器
    
- 单点登录 (Single Sign On SSO)
    
    - CAS
        
    - 处理流程 流程图参考 [Web flow diagram](https://apereo.github.io/cas/4.2.x/protocol/CAS-Protocol.html)
        
        - 首次登录 应用1
        
        1. 用户登录初次应用服务器，未携带应用相关cookie信息;
        2. 应用服务器判断未授权, 重定向到CAS服务器;
        3. 用户重定向到CAS服务器 ,展示登录页面;
        4. 用户输入用户密码登录, 用户验证通过，CAS服务器生成SSO session, CASTGC cookie包含TGT返回用户,TGT会被存放到SSO session中, 返回给客户ticket, 应用拿到这个ticket到CAS验证用户是否登录, CAS应用重定向到应用服务器;
        5. 用户携带ticket到应用服务器；
        6. 应用服务器带着ticket到CAS进行验证;
        7. 身份验证成功, 返回应用系统
        8. 应用系统创建自己的SESSION，并通知客户端设置cookie信息
        9. 客户端携带应用的cookie信息就可以访问应用了;
        
        - 再次登录应用1
        
        1. 应用系统创建自己的SESSION，并通知客户端设置cookie信息
        2. 客户端携带应用的cookie信息就可以访问应用了;
        
        - 登录应用2
        
        1. 用户登录初次应用服务器，未携带应用2相关cookie信息;
        2. 应用服务器判断未授权, 重定向到CAS服务器;
        3. 用户登录CAS携带TGC，CAS使用TGC验证TGT后，返回ST给用户;
        4. 用户携带ST访问应用2;
    - JWT, OAuth, OpenID
        
    - JWT JWT-JSON Web Tokens: 这只是令牌格式。JWT令牌是JSON编码的数据结构，包含有关发行者，主题，到期时间等信息。经过签名以进行篡改证明和真实性，并且可以使用对称或不对称方法对其进行加密以保护令牌信息。
        
    - OAuth2: 解决了用户希望使用客户端软件（例如基于浏览的Web应用程序，本机移动应用程序或桌面应用程序）访问数据的问题。 OAuth2仅用于授权，可以授权客户端软件使用访问令牌代表最终用户访问资源。
        
    - OpenID Connect-OpenID Connect建立在OAuth2之上并添加身份验证。 OpenID Connect向OAuth2添加了一些约束，例如UserInfo端点，ID令牌，OpenID Connect提供程序的发现和动态注册以及会话管理。
        

## 访问控制

访问控制常见的四种: DAC, role-BAC, rule-BAC, MAC

- DAC 所有这维护规则，如Linux的文件访问权限.
    
- role-BAC 基于角色，根据不同权限方案分组设定角色. linux group
    
- rule-BAC 基于请求， 如防火墙的控制策略.
    
- MAC 强制访问控制, 每一份数据针对每一个角色都有机密等级
    

## 威胁评估

- 识别数据
    
    安全保护的核心资产
    
- 识别攻击
    
    分析可能的攻击方式
    
- 识别漏洞
    
    根据应用识别可能的漏洞
    

## 相关链接

[极客时间-安全功能技能30讲-安全的本质](https://time.geekbang.org/column/article/3557065b64ff9d82517d023d9e60ff3a/share?code=zvdEOSVenU1ecuo-XkU0eJ8AwvikBharLgQ5-U18L%2F8%3D) [极客时间--安全功能技能30讲-安全原则](https://time.geekbang.org/column/article/fd0bfd9ad7cf82606d51ef07ed0d0a26/share?code=zvdEOSVenU1ecuo-XkU0eJ8AwvikBharLgQ5-U18L%2F8%3D&oss_token=e2ba381c134d7b00) [极客时间--安全功能技能30讲-密码学基础](https://time.geekbang.org/column/article/b7147a59c8530f3f3e0b3615aec8f2ba/share?code=zvdEOSVenU1ecuo-XkU0eJ8AwvikBharLgQ5-U18L%2F8%3D) [极客时间--安全功能技能30讲-身份认证](https://time.geekbang.org/column/article/06749d38a5dd4a7078be91b1afca6648/share?code=zvdEOSVenU1ecuo-XkU0eJ8AwvikBharLgQ5-U18L%2F8%3D) [极客时间--安全功能技能30讲-访问控制](https://time.geekbang.org/column/article/fa173dad4f6fd48736c8c8bab0f5bce7/share?code=zvdEOSVenU1ecuo-XkU0eJ8AwvikBharLgQ5-U18L%2F8%3D) [Cybersecurity vs. Information Security: Is There a Difference?](https://cloudacademy.com/blog/cybersecurity-vs-information-security-is-there-a-difference/) [confidentiality, integrity, and availability (CIA triad)](ttps://whatis.techtarget.com/definition/Confidentiality-integrity-and-availability-CIA) [khanacademy-Cybersecurity](https://www.khanacademy.org/partner-content/nova/nova-labs-topic#cyber) [19 Cybersecurity Best Practices to Protect Your Business](https://phoenixnap.com/blog/cybersecurity-best-practices) [Password Hashing: Scrypt, Bcrypt and ARGON2](https://medium.com/analytics-vidhya/password-hashing-pbkdf2-scrypt-bcrypt-and-argon2-e25aaf41598e) [Salted Password Hashing - Doing it Right](https://crackstation.net/hashing-security.htm#faq) [What are the main differences between JWT and OAuth authentication?](https://stackoverflow.com/questions/39909419/what-are-the-main-differences-between-jwt-and-oauth-authentication)

