> For the complete documentation index, see [llms.txt](https://docs-hfish.hscsec.cn/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs-hfish.hscsec.cn/qi-ta/mi-guan-yin-cang-fang-an.md).

# 蜜罐隐藏方案

## 前言

通常厂商威胁捕捉与诱骗系统内置的蜜罐的特征，都在各红队挂上号了。哈希时代下的蜜罐隐藏，只能开发自定义蜜罐以规避哈希识别。

对于一个正常服务，通常情况下不会使用ip+端口，或域名+端口的形式提供服务。一个长期使用的外部应用服务通常使用子域名，以及ssl加密，即https传输。然而，正常服务也可以收集登录正确与失败的账号密码。

本文内容基于微步HFish胁捕捉与诱骗系统。

蜜罐于HFish后台启用后，使用三级域名以及反向代理nginx伪装为正常服务。

## 单个域名申请证书

使用certbot申请证书

> Let's Encrypt是一个数字证书认证机构，旨在以自动化流程消除手动创建和安装证书的复杂流程，并推广使万维网服务器的加密连接无所不在，为安全网站提供免费的SSL/TLS证书。

### 前置步骤：

于/etc/nginx/conf.d/文件夹下，将以下内容写入文件，命名为\*.conf（建议为命名为hfish.conf，星号内容可自定义）

```
server {
    listen      80;
    listen      [::]:80;
    server_name sub.domain.com;							#将sub.domain.com替换为需要申请证书的域名

    #反向代理 / 用于let's encrypto验证域名归属
    location ^~ /.well-known/acme-challenge/{
        default_type "text/plain";
        root /;
    }
}
```

文件写入后运行命令

```
nginx -t && systemctl restart nginx
```

安装certbot

```
# ubuntu系统
apt install certbot
# centos系统
yum install certbot
```

完成域名验证并生成证书

```
certbot certonly --webroot sub.domain.com					#将sub.domain.com替换为需要申请证书的域名
```

运行该命令后根据提示输入验证文件地址。根据配置，验证地址为root /; ，即此处输入‘/’即可。

生成证书与密钥默认存放于/etc/letsencrypt/live/domain.com/文件夹下，此时将/etc/nginx/conf.d/文件夹下（建议为命名为hfish.conf）配置文件替换为完整的配置文件并运行以下命令即可。

```nginx
nginx -t && systemctl restart nginx
```

### 完整配置文件：

```
server {
    listen                  443 ssl http2;
    listen                  [::]:443 ssl http2;
    server_name sub.domain.com;							#需要将sub.domain.com替换为您所使用的子域名。

    ssl_certificate         /etc/nginx/cert/sub.domain.com.pem;			#您的证书存储位置，通常位于/etc/nginc/cert文件夹下，需要将sub.domain.com.pem替换为您的证书文件。
    ssl_certificate_key     /etc/nginx/cert/sub.domain.com.key;			#您证书私钥的存储位置，通常位于/etc/nginc/cert文件夹下，需要将sub.domain.com.key替换为您证书私钥文件。


    # 反向代理 / 用于与 Web 服务
    location / {
        proxy_pass https://127.0.0.1:[port]$request_uri;			#port更改为蜜罐启用所设置的端口
        proxy_pass http://cloud/;
        proxy_redirect off;
        proxy_set_header host $host;
        proxy_set_header x-real-ip $remote_addr;
        proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
        proxy_set_header x-forwarded-host $server_name;
    }
}

# HTTP 重定向至 HTTPS
server {
    listen      80;
    listen      [::]:80;
    server_name sub.domain.com;
    location / {
        return 301 https://sub.domain.com$request_uri? permanent;
    }
}
```

说明

* 本文件为生成证书后所使用的文件，存放于/etc/nginx/conf.d/文件夹下（建议为命名为hfish.conf）。

### CERT证书自动续期方案

编辑定时任务

```
crontab -e										#首次使用定时任务则选择“2”，使用vim编辑
```

写入以下命令，将domain.com替换为需要自动需求的域名

```
00 00 1 * * certbot renew --force-renewal && systemctl restart nginx			#每月一号强制续期所有使用certbot生成的证书
```

> certbot申请由Let's encrypto签发的证书通常有效期为三个月，剩余有效期大于三十日则判定为证书有效无法续期，此时使用“--force-renewal ”强制续期即可。
>
> 值得注意的是，Let's encrypto限制单个域名/IP每周生成证书最多五十个，每次生成证书时错误尝试次数小于等于五次。建议生成证书时先加入参数“--dry-run”测试。

## 泛解析方案

泛解析使用acme协议申请证书。

> 简单来说acme.sh 实现了 acme 协议, 可以从 let‘s encrypt 生成免费的证书。 acme.sh 有以下特点：
>
> * 一个纯粹用Shell（Unix shell）语言编写的ACME协议客户端。
> * 完整的ACME协议实施。 支持ACME v1和ACME v2 支持ACME v2通配符证书
> * 简单，功能强大且易于使用。你只需要3分钟就可以学习它。
> * Let's Encrypt免费证书客户端最简单的shell脚本。
> * 纯粹用Shell编写，不依赖于python或官方的Let's Encrypt客户端。
> * 只需一个脚本即可自动颁发，续订和安装证书。 不需要root/sudoer访问权限。
> * 支持在Docker内使用，支持IPv6

不同意certbot的是，使用acme申请证书无需使用nginx验证域名，仅需提供域名所有者于域名解析商的注册邮箱以及CF密钥。当然，也可也使用dns设置txt解析记录校验泛解析域名归属。

下文基于使用CF密钥申请泛解析证书。dns设置txt验证可能会导致dns设置混乱，可能不利于长期运维。

### 使用CF\_key申请泛解析ssl证书

```
git clone https://github.com/acmesh-official/acme.sh.git && cd ./acme.sh
./acme.sh --install -m [your_email]							#将[your_email]替换为你的邮箱
export email="[your_email]"								#将[your_email]替换为你的邮箱
alias acme.sh=/root/.acme.sh/acme.sh
acme.sh --set-default-ca --server letsencrypt
export CF_Email="[your_email]"								#将[your_email]替换为你在域名解析商注册的邮箱
export CF_Key="[your_CF_key]"								#将[your_CF_key]替换为你的CF密钥
```

```
acme.sh --issue --dns dns_cf -d *.domain.com --keylength ec-256
```

### 自动续期方案

编辑定时任务

```
crontab -e								#首次使用定时任务则选择“2”，使用vim编辑
```

写入以下命令，将domain.com替换为需要自动续期的域名

```
00 00 1 * * acme.sh --issue --force --dns dns_cf -d *.log.hscsec.cn --keylength ec-256 && systemctl restart nginx	#每月一号强制续期所有使用acme生成的证书
```

### Nginx配置文件\*.conf

```
server {
    listen                  443 ssl http2;
    listen                  [::]:443 ssl http2;
    server_name sub.domain.com;								#需要将sub.domain.com替换为您所使用的子域名。

    ssl_certificate         /root/.acme.sh/*.domain.com_ecc/fullchain.cer;		#您的证书存储位置，通常位于.acme.sh文件夹下，需要将domain.com替换为您的域名。
    ssl_certificate_key     /root/.acme.sh/*.domain.com_ecc/*.domain.com.key;	#您证书私钥的存储位置，通常位于.acme.sh文件夹下，需要将domain.com替换为您的域名。
  
    # 反向代理 / 用于与 Web 服务
    location / {
        proxy_pass https://127.0.0.1:[port]$request_uri;				#port更改为蜜罐启用所设置的端口
        proxy_redirect off;
        proxy_set_header host $host;
        proxy_set_header x-real-ip $remote_addr;
        proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
        proxy_set_header x-forwarded-host $server_name;
    }
}
```

HTTP 重定向至 HTTPS

```
# HTTP 重定向至 HTTPS
server {
    listen 80;
    server_name ~^(?<subdomain>.+).domain.com$;
    rewrite ^ https://$subdomain.domain.com$request_uri? permanent;
}
```
