vault backup: 2026-01-05 13:03:55

This commit is contained in:
windyboy
2026-01-05 13:03:55 +08:00
parent 21460fc35d
commit be7c6cdcc9
589 changed files with 396508 additions and 27 deletions
@@ -0,0 +1,34 @@
---
page-title: "Adding and trusting a Certificate Authority (CA) in Fedora Antonio Maradiaga Collection of things I'm interested in / working on"
url: https://ajmaradiaga.com/Adding-trusting-CA-Fedora/
date: "2023-03-30 16:40:18"
---
## Adding and trusting a Certificate Authority (CA) in Fedora
When running Citrix on Fedora, I was getting an error message similar to the following: “SSL Error 61: You have not chosen to trust Certificate Authority’”. Basically, the CA (certificate authority) cert was missing in my operating system. To fix this, we need to do the following:
1. Find the CAs certificate online.
2. Ensure that the certificate is in PEM format (if not, convert it to PEM).
3. Move the PEM file to `/etc/pki/ca-trust/source/anchors`.
4. Update the CA trust in the operating system.
In the example below, I add and trust GoDaddys root G2 certificate:
```
# Download GoDaddy - G2 root certificate
wget https://ssl-ccp.godaddy.com/repository/gdroot-g2.crt
# Convert CRT to PEM
openssl x509 -in gdroot-g2.crt -out gdroot-g2.pem -outform PEM
# Move the PEM cert and update the CA trust
sudo mv gdroot-g2.pem /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust
```
### References:
- Convert CRT to PEM: https://stackoverflow.com/questions/4691699/how-to-convert-crt-to-pem
- Trusting additional CAs in Fedora: https://www.happyassassin.net/2015/01/14/trusting-additional-cas-in-fedora-rhel-centos-dont-append-to-etcpkitlscertsca-bundle-crt-or-etcpkitlscert-pem/
Written on December 3, 2019
@@ -0,0 +1,842 @@
---
page-title: "zhiqiang feng / DailySync · GitLab"
url: https://gitlab.com/zhiqiangf/dailysync
date: "2023-03-08 14:00:07"
---
## 佳明运动数据同步与采集工具
[![workflow](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/workflow.png)](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/workflow.png)
[关注作者Strava ![Strava](https://badges.strava.com/logo-strava.png)](https://strava.com/athletes/84396978)
[![](https://user-content.gitlab-static.net/5d5eed4360b9480994f5980b724af6841a1edd71/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f2d54656c656772616d2d2532333236413545343f7374796c653d666c61742d737175617265266c6f676f3d74656c656772616d266c6f676f436f6c6f723d666666666666)](https://t.me/garmindailysync)
## 本地运行方案
首先确保运行此脚本的机器能够访问国际互联网, 如国外VPS、家庭全局科学的环境等, 否则无法正常登录佳明国际区
## 检查网络情况确保正常访问佳明服务
### 测试国际互联网网络连通性
执行后确保能像如下显示再进行下面步骤,否则请检查网络环境(命令行也需要能访问国际互联网, 如果google在浏览器能正常访问,但是命令行无法ping通,google搜索关键词**命令行翻墙**,参考配置一下重试)
```
root@home:~# ping google.com
正在 Ping google.com [198.18.1.9] 具有 32 字节的数据:
来自 198.18.1.9 的回复: 字节=32 时间<1ms TTL=64
来自 198.18.1.9 的回复: 字节=32 时间<1ms TTL=64
来自 198.18.1.9 的回复: 字节=32 时间<1ms TTL=64
来自 198.18.1.9 的回复: 字节=32 时间<1ms TTL=64
198.18.1.9 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失)
往返行程的估计时间(以毫秒为单位):
最短 = 0ms,最长 = 0ms,平均 = 0ms
```
### 测试佳明国际区网络连通性
```
root@home:~# ping sso.garmin.com
PING sso.garmin.com.cdn.cloudflare.net (104.17.113.66) 56(84) bytes of data.
64 bytes from 104.17.113.66 (104.17.113.66): icmp_seq=1 ttl=63 time=1.92 ms
64 bytes from 104.17.113.66 (104.17.113.66): icmp_seq=2 ttl=63 time=1.27 ms
64 bytes from 104.17.113.66 (104.17.113.66): icmp_seq=3 ttl=63 time=2.43 ms
--- sso.garmin.com.cdn.cloudflare.net ping statistics ---
```
### 测试中国区网络连通性
```
root@home:~# ping sso.garmin.cn
PING sso.garmin.cn (61.150.74.194) 56(84) bytes of data.
64 bytes from 61.150.74.194: icmp_seq=1 ttl=63 time=1.69 ms
64 bytes from 61.150.74.194: icmp_seq=2 ttl=63 time=2.77 ms
64 bytes from 61.150.74.194: icmp_seq=3 ttl=63 time=7.12 ms
--- sso.garmin.cn ping statistics ---
```
### 安装 `NodeJS`
下载地址 [https://nodejs.org/en/](https://nodejs.org/en/)
### 开启 `yarn`
`NodeJS` 安装完毕后,新打开一个管理员命令行窗口, 输入命令执行
### 安装依赖
`README.md`同级目录打开命令行,执行
Windows在文件管理器中打开脚本所在的目录,在地址栏输入 `cmd` 然后回车,即可打开命令行,这个步骤不需要管理员权限
### 填入账号密码
打开 `src/constant.ts`, 填入您的佳明账号及密码
### 运行脚本
注意: 如果执行不能成功,请尝试将梯子更换为美国IP,多更换几个ip试试
同步中国区到国际区
同步国际区到中国区
#### 常见问题
如果上面ping都正常,却仍然不能正常运行,请尝试将梯子更换为美国IP
## 定时任务(Linux Only)
上面手动执行名称成功迁移后,可以添加定时任务来自动执行
`crontab -e` 打开定时任务编辑,按需添加:
### 每3小时检查并同步国际区到中国区【可选】,注意PATH和SHELL两行也要写上
```
PATH=$PATH:/usr/local/bin:/usr/bin
SHELL=/bin/bash
* */3 * * * cd /root/code/dailysync/ && yarn --cwd /root/code/dailysync/ sync_global >> /var/log/dailysync.log 2>&1
```
### 每3小时检查并同步中国区到国际区【可选】,注意PATH和SHELL两行也要写上
```
PATH=$PATH:/usr/local/bin:/usr/bin
SHELL=/bin/bash
* */3 * * * cd /root/code/dailysync/ && yarn --cwd /root/code/dailysync/ sync_cn >> /var/log/dailysync.log 2>&1
```
其中 `/root/code/dailysync/`为脚本在机器上的目录地址,更换为您机器上的目录即可
[![](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/crontab-e.png)](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/crontab-e.png)
### 运行日志查看
```
tail -100f /var/log/dailysync.log
```
### 修改定时任务执行频率
当前为 `*/10 * * * *` 每 10 分钟执行一次
您可以按需修改, 参考网址 [https://crontab.guru/examples.html](https://crontab.guru/examples.html)
列举几个常用的:
每小时执行一次: `0 * * * *`
每6小时执行一次: `0 */6 * * *`
每12小时执行一次: `0 */12 * * *`
---
**自动 安全 省心**
**如果看不到此文档的图片,请移步 [知乎链接](https://zhuanlan.zhihu.com/p/543799435)**
此工具实现了佳明运动活动数据(生理数据如睡眠,身体电量,**步数** 等除外)的一次性迁移与日常运动数据同步,实现同步运动数据到到Strava [Strava全球热图](https://www.strava.com/heatmap) 。 额外还实现了RQ数据采集记录跑力的长期趋势及自动签到。
## 功能
### 迁移数据
- 支持佳明账号中已有的运动数据从中国区一次性迁移到国际区。对应 `Action`: `Migrate Garmin CN to Garmin Global`
- 支持佳明账号中已有的运动数据从国际区一次性迁移到中国区。对应 `Action`: `Migrate Garmin Global to Garmin CN`
### 同步数据
- 约每20分钟左右检查当前中国区账号中是否有新的运动数据,如有则自动下载上传到国际区,并同步到Strava。 对应 `Action`: `Sync Garmin CN to Garmin Global`
- 如果您常用的是国际区,想要在国内运动软件(悦跑圈/咕咚/keep/郁金香等等)同步运动数据及微信运动中显示 【Garmin手表 骑行xx分钟】([微信运动效果](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/wx_sport.jpg)) 此工具可以实现自动反向同步中国区。 对应 `Action`: `Sync Garmin Global to Garmin CN`
- 微信步数同步:
- `iOS`: 佳明爱运动小程序绑定后,国际区->中国区同步仅能同步活动数据。出去运动不带手机的话,步数会记录在手表中,活动同步后,`Connect`会将步数上传到`健康` App 中,微信与健康应用链接,即可在微信运动中看到步数。
- `Android`: 暂无可行方法。
- 如无特殊需求,强烈建议不要将两个同步脚本同时打开,按需开启一个即可!
### 采集数据
- 采集RQ统计数据到GoogleSheets,记录跑力的长期趋势。参见: [RQ数据采集到GoogleSheets教程](https://gitlab.com/zhiqiangf/dailysync/-/blob/main/RQ_GoogleSheets.md)
- RQ自动签到。参见:[RQ自动签到](https://gitlab.com/zhiqiangf/dailysync/-/blob/main/RQ_Sign.md)
## 说明
#### 免责声明:
本工具仅限用于学习和研究使用,不得用于商业或者非法用途。如有任何问题可联系本人删除。
#### 账号安全:
账号及密码保存在自己的 `github secrets` 中,不会泄露,运行代码均 **开放源码**,欢迎提交`PR`
#### 进群讨论
为方便讨论,请加我绿色软件:nononopass (下面扫码)我拉你进群。`nononopass` 我拉你进群。 [![二维码扫码](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/wechat_qr.png)](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/wechat_qr.png)
#### 支持作者
如果帮助到了你,可以 [Buy Me a Coffee](https://gitlab.com/zhiqiangf/dailysync#buy-me-a-coffee),赞助者会在文章下方留下ID表示感谢🙏。
#### 关键更新日志
- 2022-10-11:佳明服务器抽风,需要重置密码才能继续使用账号
> 解决方法如下,另外对代码也进行了优化,将登录信息加密存储复用,不必每次执行同步任务都登录一次,所以需要新增一条secrets,见下面解决方法。
```
最近如果收到来自佳明重置密码的邮件(国际区)/短信(中国区),请按照如下方式操作一下(没收到可以先不管,也有可能仅收到国际区的邮件,如果收到就重置对应区的密码):
1、登录ConnectWeb页面:国际区:https://connect.garmin.com/modern/ 中国区:https://connect.garmin.cn/modern
2、然后用邮箱收到的临时密码登录,重置密码,重置密码可以和原来密码相同,但是为了安全还是建议您更换一个新密码
3、如果您在第2步更换了新密码,在Github的secrets中更新 GARMIN_GLOBAL_PASSWORD 的值为国际区新密码,GARMIN_PASSWORD 的值为中国区新密码
4、更新代码,方法见文档FAQ
5、在Github的secrets中新增一条记录,名称 AESKEY ,内容为任意小于32位长度的字符串,用于加密账号登录信息,举例(不要复制使用):KAD1JLA12SKDJLASDJ
```
- 2022-09-01: 新增支持国际区同步新数据到中国区
- 新增一个`action``Sync Garmin Global to Garmin CN`,开启后自动执行。与同步中国区到国际区操作一致。
- 2022-08-07: 支持国际区迁移数据到中国区
- 新增一个`action``Migrate Garmin Global to Garmin CN`,手动执行。与迁移中国区到国际区操作一致。
- 2022-06-15: 增加佳明中国区迁移及同步国际区数据功能,同步 `strava`
- 2022-06-06: 采集`RQ`统计数据到`Google Sheets`
#### 在用这个工具的大佬们(除了作者)欢迎点进链接加加好友~(点击展开) ([填写您的链接](https://wj.qq.com/s2/10633783/a1ef/)
名称
Strava运动员链接
Zhitao Yan
[https://www.strava.com/athletes/84396978](https://www.strava.com/athletes/84396978)
‍💻Author
Clown jiang
[https://www.strava.com/athletes/105952743](https://www.strava.com/athletes/105952743)
✨Sponsor
老弟
[https://www.strava.com/athletes/91478457](https://www.strava.com/athletes/91478457)
✨Sponsor
Zax Wen
[https://www.strava.com/athletes/91553718](https://www.strava.com/athletes/91553718)
✨Sponsor
李二牛
[https://www.strava.com/athletes/43684509](https://www.strava.com/athletes/43684509)
✨Sponsor
围脖B站@我是冯瑞恒
[https://www.strava.com/athletes/34349982](https://www.strava.com/athletes/34349982)
✨Sponsor
[https://www.strava.com/athletes/67222235](https://www.strava.com/athletes/67222235)
✨Sponsor
狼朗
[https://www.strava.com/athletes/43107517](https://www.strava.com/athletes/43107517)
✨Sponsor
微醺漂移
[https://www.strava.com/athletes/19108713](https://www.strava.com/athletes/19108713)
✨Sponsor
hua xu
[https://www.strava.com/athletes/40855048](https://www.strava.com/athletes/40855048)
L.X
[https://www.strava.com/athletes/86727066](https://www.strava.com/athletes/86727066)
姜宁
[https://www.strava.com/athletes/54001163](https://www.strava.com/athletes/54001163)
jogging tiger
[https://www.strava.com/athletes/105416045](https://www.strava.com/athletes/105416045)
Eph
[https://www.strava.com/athletes/8376311](https://www.strava.com/athletes/8376311)
YunBond
[https://www.strava.com/athletes/33650658](https://www.strava.com/athletes/33650658)
ygnnbpkn
[https://www.strava.com/athletes/107433069](https://www.strava.com/athletes/107433069)
HY.Dong
[https://www.strava.com/athletes/8901566](https://www.strava.com/athletes/8901566)
✨Sponsor
陆凡
[https://www.strava.com/athletes/48067019](https://www.strava.com/athletes/48067019)
✨Sponsor
JiaJian He
[https://www.strava.com/athletes/13495215](https://www.strava.com/athletes/13495215)
✨Sponsor
生如胡杨
[https://www.strava.com/athletes/107773658](https://www.strava.com/athletes/107773658)
✨Sponsor
doudouhuang
[https://www.strava.com/athletes/107830101](https://www.strava.com/athletes/107830101)
解凌曦
[https://www.strava.com/athletes/62080682](https://www.strava.com/athletes/62080682)
✨Sponsor
欢乐铁三陈琨
[https://www.strava.com/athletes/107733443](https://www.strava.com/athletes/107733443)
Fseeeee
[https://www.strava.com/athletes/45675087](https://www.strava.com/athletes/45675087)
神月
[https://www.strava.com/athletes/69135349](https://www.strava.com/athletes/69135349)
清风故人
[https://www.strava.com/athletes/105799254](https://www.strava.com/athletes/105799254)
lu\_yuanyuan
[https://www.strava.com/athletes/lu\_yuanyuan](https://www.strava.com/athletes/lu_yuanyuan)
axiuff
[https://www.strava.com/athletes/107599333](https://www.strava.com/athletes/107599333)
iceirislei
[https://www.strava.com/athletes/84396978](https://www.strava.com/athletes/84396978)
江小鱼
[https://www.strava.com/athletes/29648564](https://www.strava.com/athletes/29648564)
作樂
[https://www.strava.com/athletes/102557902](https://www.strava.com/athletes/102557902)
Ink Jiang
[https://www.strava.com/athletes/107398383](https://www.strava.com/athletes/107398383)
kk
[https://www.strava.com/athletes/108302326](https://www.strava.com/athletes/108302326)
Kailin Aogu
[https://www.strava.com/athletes/108426264](https://www.strava.com/athletes/108426264)
Jason
[https://www.strava.com/athletes/78018552](https://www.strava.com/athletes/78018552)
七叔uncle
[https://www.strava.com/athletes/100219084](https://www.strava.com/athletes/100219084)
lenmio
[https://www.strava.com/athletes/23144564](https://www.strava.com/athletes/23144564)
王冰
[https://www.strava.com/athletes/96827296](https://www.strava.com/athletes/96827296)
AndrewRen
[https://www.strava.com/athletes/47354232](https://www.strava.com/athletes/47354232)
湖南吴彦祖
[https://www.strava.com/athletes/27560743](https://www.strava.com/athletes/27560743)
古玉沁心
[https://www.strava.com/athletes/guyuqinxin](https://www.strava.com/athletes/guyuqinxin)
✨Sponsor
FLynn
[https://www.strava.com/athletes/103444104](https://www.strava.com/athletes/103444104)
herui9706
[https://www.strava.com/athletes/26760320](https://www.strava.com/athletes/26760320)
跑得动跑不动
[https://www.strava.com/athletes/92683851](https://www.strava.com/athletes/92683851)
Alexlei
[https://www.strava.com/athletes/85319344](https://www.strava.com/athletes/85319344)
Benny
[https://www.strava.com/athletes/106952288](https://www.strava.com/athletes/106952288)
挖煤猫
[https://www.strava.com/athletes/108006082](https://www.strava.com/athletes/108006082)
行者阿里
[https://www.strava.com/athletes/107605370](https://www.strava.com/athletes/107605370)
谌雕
[https://www.strava.com/athletes/100452318](https://www.strava.com/athletes/100452318)
米有才
[https://www.strava.com/athletes/lu\_yuanyuan](https://www.strava.com/athletes/lu_yuanyuan)
昊子LoveCoCo
[https://www.strava.com/athletes/11280405](https://www.strava.com/athletes/11280405)
✨Sponsor
HuangXin
[https://www.strava.com/athletes/105468976](https://www.strava.com/athletes/105468976)
DougSun
[https://www.strava.com/athletes/dougsun](https://www.strava.com/athletes/dougsun)
我是渣跑
[https://www.strava.com/athletes/37057287](https://www.strava.com/athletes/37057287)
古蒂
[https://www.strava.com/athletes/68463270](https://www.strava.com/athletes/68463270)
小脑腐
[https://www.strava.com/athletes/105403238](https://www.strava.com/athletes/105403238)
Winter
[https://www.strava.com/athletes/110758645](https://www.strava.com/athletes/110758645)
## 如何使用?
视频教程参考: [中国区佳明运动数据同步Strava视频教程](https://www.bilibili.com/video/BV1v94y1Q7oR/)
如果按照视频还是无法达到预期的效果(包括佳明国际区点不进去,跳转到com.cn、github 添加 secrets 没有反应等),请自行解决不可描述的网络问题。 如果`github` 上的图片看不到,那大概率是被墙了,看图请移步 [知乎链接](https://zhuanlan.zhihu.com/p/543799435), 文档内容以`github` 版本为准,其他地方可能不是最新的。
## 教程开始
### 迁移已有运动数据,并开启自动同步功能
[佳明国际区网址](https://connect.garmin.com/signin/)
[佳明国区网址](https://connect.garmin.cn/signin/)
[Strava网址](https://www.strava.com/)
#### 前置条件:
##### **注册好佳明国际区的帐号及Strava账号,并已经将Strava与佳明国际区账号关联,并开启Strava数据权限(下图)**
---
## **如果看不到此文档的图片,请移步 [知乎链接](https://zhuanlan.zhihu.com/p/543799435)**
[![consent](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/consent.png)](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/consent.png)
##### 佳明账号隐私设置
如果是新注册的账号,包括中国区与国际区,请确保账号隐私设置中的`存储和处理``同意`状态,`设备上传``已启用` 状态(下图) ,否则上传数据会报`412`错误码:`User explicity revoked consent for uploading files.` [![connect_permission](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/connect_permission.png)](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/connect_permission.png)
##### 关闭佳明账号两步验证
如果的佳明账号在登录网页版Connect时,需要填入验证码,说明您开启了两步验证,需要关闭此选项才能使用本工具,如果不需要验证码就能登录,可跳过此步骤。
点击下方链接,请按照图中设置关闭
[https://www.garmin.cn/zh-CN/account/security/mfa](https://www.garmin.cn/zh-CN/account/security/mfa) [![mfa](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/mfa.jpg)](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/mfa.jpg)
---
#### Step1: fork 此工程
点击【Fork】,**也请顺手点一下【Fork】旁边的【Star】,支持一下作者** ,fork到自己账号下。 [![fork](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/fork.jpg)](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/fork.jpg)
#### Step2: 配置填入自己的佳明国内区、国际区账号及密码
如下图打开Secrets配置,点击 【New repository secret】 [![settings](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/settings.jpg)](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/settings.jpg)
准备自己的帐号密码及要迁移的数据量
**佳明国内账号邮箱地址** `GARMIN_USERNAME`
**佳明国内账号密码** `GARMIN_PASSWORD`
**佳明国际账号邮箱地址** `GARMIN_GLOBAL_USERNAME`
**佳明国际账号密码** `GARMIN_GLOBAL_PASSWORD`
**要迁移的活动数量,先填1**: `GARMIN_MIGRATE_NUM`
**从第几个活动开始迁移,先填 0**: `GARMIN_MIGRATE_START`
**2022-10-11新增必填项:**: `AESKEY` 信息加密存储KEY,可以随意输入任意小于32位长度的字符串,举例(不要复制使用):`KAD1JLA12SKDJLASDJ`
共计7个
[![secrets](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/secrets.jpg)](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/secrets.jpg)
填完后确保如下图红框内的都填上了, 红框外的不用管
[![secrets](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/secrets_ok1.png)](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/secrets_ok1.png) 必须的权限设置,否则会不成功 [![repo_permission](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/repo_permission.png)](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/repo_permission.png)
#### Step3: 手动迁移已有数据
对应的Actions,按需选择运行
`Migrate Garmin CN to Garmin Global(中国区到国际区)`
`Migrate Garmin Global to Garmin CN(国际区到中国区)`
这里以中国区到国际区为例,如下图,点击`Actions`\--> `Migrate Garmin CN to Garmin Global(中国区到国际区)` --> `Run workflow` 执行迁移数据 [![migrate](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/migrate.jpg)](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/migrate.jpg)
点击后刷新页面,可以看到正在执行的任务: [![migrating](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/migrating.jpg)](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/migrating.jpg)
点进去后可以查看日志,如果 `Run yarn migrate_garmin_cn_to_global`那一栏看到 `Garmin userInfo CN``Garmin userInfo global`, 并且数据持续在滚动刷新,就说明正常运行 [![test_migrate](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/test_migrate.png)](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/test_migrate.png) [![log](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/log.jpg)](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/log.jpg)
如果上面一切正常,运行结束后,前面会是一个绿色,代表运行完成。 [![migrated](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/migrated.png)](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/migrated.png)
这个时候,去佳明国际区和`strava`看看,是否有1条数据迁移过来,如果没有,代表有问题,请联系我咨询,如果有,代表正常运行。
(这一块如果看文字不是很清楚到话去看看文章开始部分的视频教程,参照看看)
上面正常的话开始迁移剩余数据
**回到 Step2 的地方,分别修改**
`GARMIN_MIGRATE_NUM``500`
`GARMIN_MIGRATE_START``1`
然后按照上面执行过的步骤,参照Step3再执行一次,执行成功后检查佳明国际区及Strava上是否迁移过来。
您可以在Strava页面核对总的运动记录数。 [https://www.strava.com/athlete/training](https://www.strava.com/athlete/training) [![strava_activities](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/strava_activities.png)](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/strava_activities.png)
如果您数据较多,如几千条的情况,需要多运行几次。
- 修改 `GARMIN_MIGRATE_START` 的值为之前累计的值 `501`
- 按照 `Step2` 运行
-`GARMIN_MIGRATE_START` 的值增加 `500`
- 按照 `Step2` 运行 ,直至所有数据迁移完成
执行迁移的时候,请不要在web端再登录connect账号,同时请**打开日志观察执行情况,中间极有可能佳明的接口出异常导致任务失败**,如果遇到失败的情况,检查日志,看失败的时候`相对总数`是多少条
```
本次开始向国际区上传第 一 条数据,【相对总数】上传到 七零一 条, 【 xx市 公路自行车 】,开始于 【 20xx-x-x 19:11:10 】,活动ID: 【 0000000 】
upload to garmin activity {
detailedImportResult: {
uploadId: 155871498739,
uploadUuid: { uuid: '0a80bfce-f94c-4ced-8fdd-8c3075032018' },
owner: 107917164,
fileSize: 29087,
processingTime: 49,
creationDate: '2022-10-01 12:51:18.931 GMT',
ipAddress: null,
fileName: '44055967_ACTIVITY.fit',
report: null,
successes: [],
failures: []
}
}
```
然后将 `GARMIN_MIGRATE_START` 修改为失败时的`相对总数`,是数字,如`701`,不是上边日志里的文字数字。然后重新执行,直到所有数据迁移完成。
> 迁移数据比较慢,请耐心等待,实测15分钟迁移100条左右
#### Step4: 自动同步新的运动数据
对应的Actions,按需选择运行
`Sync Garmin CN to Garmin Global (中国区到国际区)`
`Sync Garmin Global to Garmin CN(国际区到中国区)`
下面以中国区到国际区为例
如图点击开启`workflow` [![enable_workflow](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/enable_workflow.jpg)](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/enable_workflow.jpg)
**开启后无需额外配置,除早上外,其他时候大约每30分钟左右自动同步一次数据,一段时间后可以查看同步记录.** [![sync](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/sync.jpg)](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/sync.jpg)
至此,所有工作完毕,强烈建议阅读完下方的`FAQ`部分,您后期可能遇到的大部分问题都会有解答。
如果我的工作帮到了您,可以考虑在最下方扫码赞助我一杯咖啡哦~
#### FAQ:
##### 数据没有同步成功?
可能的原因:
1. 请先检查手机`connect`,确保运动在`connect`看到才能进行后续的同步工作。
2. 定时执行没有执行,可以像执行`MIGRATE`那样手动执行`Sync Garmin CN to Garmin Global (中国区到国际区)`或者`Sync Garmin Global to Garmin CN(国际区到中国区)` 来手动触发同步。可以将Github的地址在手机上存个书签,运动完手动运行一下`Sync`就能立刻同步了。
3. 检查佳明服务器状态 [https://connect.garmin.com/status](https://connect.garmin.com/status)
##### 数据同步为什么没有按计划执行,有的时候一小时才执行了2次?
参考: [Schedule every 5 mins but runs a bit randomly](https://github.community/t/schedule-every-5-mins-but-runs-a-bit-randomly/159355/2)
原因: github的定时计划任务以尽力而为的策略运行。
**我代码中写的是每10分钟执行一次,实际情况是大约每20分钟执行一次。**
尤其是早上8点左右,几乎都会延迟很久执行,原因是大概我们8点对应美国0点,其他很多程序的定时任务在0点执行,导致我们的任务抢不到计算资源,导致延迟执行。 着急的话上来手动执行一下就好。
文中建议改为每5分钟一次,但是如果这样的话会超出每月的免费可用额度。如果您急切的想同步数据,建议上来手动操作一下。
翻译:
> 欢迎来到 GitHub 支持社区!计划的操作工作流以尽力而为的策略运行。当您的计划到期时,您的工作流将添加到池中并在资源可用时运行。这意味着您可能会看到与您的计划时间和工作流运行的实际时间相比有所延迟,尽管这可能会导致更长的延迟,具体取决于当时可用的资源。 您可以安排工作流运行的最短时间为每 5 分钟一次。由于这种池化,如果在您的下一个计划设置为运行时,池中已经有运行等待,您可能会看到运行被“跳过”。 工程团队正在研究提高调度的可用性、扩展性和响应时间,但如果您需要精确的调度操作,那么您可能会更好地寻找替代解决方案,例如在您自己的 VPS 上运行 cron。
##### 需要每天都来同步数据吗?
不用。上面的步骤执行过后,MIGRATE手动迁移已有数据,再有新跑的数据会在SYNC中大约每20分钟左右自动同步一次数据
##### 修改自动同步的频率
当前为 `*/10 * * * *` 每 10 分钟执行一次
您可以按需修改, 参考网址 [https://crontab.guru/examples.html](https://crontab.guru/examples.html)
列举几个常用的:
每小时执行一次: `0 * * * *`
每6小时执行一次: `0 */6 * * *`
每12小时执行一次: `0 */12 * * *`
按您需要修改的文件:
- 中国区同步国际区: `sync_garmin_cn_to_garmin_global.yml`
- 国际区同步中国区: `sync_garmin_global_to_garmin_cn.yml`
[![update_code](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/cron.png)](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/cron.png)
##### 同步最新的代码库(更新代码)
代码可能有优化更新,如看到下图的情况,请点击下图红框更新到最新的代码 [![update_code](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/update_code.jpg)](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/update_code.jpg)
##### 收到`Github`执行失败的邮件
佳明接口偶尔抽风导致失败,不用管。 [![action_failed](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/action_failed.png)](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/action_failed.png)
##### 收到来自佳明登录提醒的邮件
本工具原理为模拟用户登录进行下载、上传操作,正常,无需理会。 [![action_failed](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/login_email.png)](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/login_email.png)
##### 关闭自动同步
如图操作即可 [![disable_sync](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/disable_sync.png)](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/disable_sync.png)
## 数据同步到佳明国际区后,其他的一些可关联的运动分析平台
[https://intervals.icu/ (强烈推荐!!)](https://intervals.icu/)
[https://app.trainingpeaks.com/#home](https://app.trainingpeaks.com/#home)
[https://runalyze.com/dashboard](https://runalyze.com/dashboard)
## 同步到佳明国际区,同步Strava
[![garmin_global](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/garmin_global.png)](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/garmin_global.png) [![strava](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/strava.png)](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/strava.png)
## 采集RQ数据教程:
点击跳转:[RQ数据采集到GoogleSheets教程](https://gitlab.com/zhiqiangf/dailysync/-/blob/main/RQ_GoogleSheets.md)
## TODO
- 采集RQ统计数据到Google表格
- 一次性批量迁移已有活动数据到国际区
- 自动同步新的活动数据到数据到国际区
- 从国际区反向迁移同步到中国区功能
- Strava数据导出上传Garmin
- Connect API 异常出错时抛出`github actions`错误,避免内部运行失败但是外部显示成功的问题。
- Docker本地部署运行版本,不依赖GitHub Action,避免自动运行间隔不固定的问题。
- WebUI 管理同步及迁移任务
- 乳酸阈值长期趋势读取与分析页面
- 参考帖子 [https://www.reddit.com/r/Garmin/comments/x2mad3/lactate\_threshold\_accuracy\_test\_from\_052019\_to/](https://www.reddit.com/r/Garmin/comments/x2mad3/lactate_threshold_accuracy_test_from_052019_to/)
- 国际区与中国区路线、训练课程同步
- api:
- 获取所有路线: [https://connect.garmin.com/web-gateway/course/owner](https://connect.garmin.com/web-gateway/course/owner)
```
{
"coursesForUser" : []
}
```
- 路线详情 [https://connect.garmin.com/course-service/course/{id}](https://connect.garmin.com/course-service/course/%7Bid%7D)
- 下载GPX [https://connect.garmin.com/course-service/course/gpx/{id}](https://connect.garmin.com/course-service/course/gpx/%7Bid%7D)
- 导入GPX [https://connect.garmin.com/modern/proxy/course-service/course/import](https://connect.garmin.com/modern/proxy/course-service/course/import)
- 上传课程,可以直接用 路线详情的响应数据,优先测试此方法。 POST [https://connect.garmin.com/course-service/course/](https://connect.garmin.com/course-service/course/)
## Star History
[![Star History Chart](https://user-content.gitlab-static.net/6fc600d6b691da2ffa530389f0edefe183b8ab20/68747470733a2f2f6170692e737461722d686973746f72792e636f6d2f7376673f7265706f733d676f6f696e2f4461696c7953796e6326747970653d44617465)](https://star-history.com/#gooin/DailySync&Date)
## Buy Me a Coffee
如果你觉得我的工作帮到了你,可赠予我一杯咖啡,感谢~ [![wechat](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/wechat.jpg)](https://gitlab.com/zhiqiangf/dailysync/-/raw/main/assets/wechat.jpg)
### 支持者记录
姓名
金额(¥)
Monk\*\*\*\*IN
50
Cl\*\*N
50
無敵\*\*十
50
\*弟
50
S\*\*en
66
C\*\*2
8.88
星\*\*烂
30
李\*牛
15
狼\*
16.18
50
A\*w
50
\*昱
20
\*仔
8.88
\*飞
50
ZKY
50
L\*\*n
40
微\*\*移
25
\*宫
100
无\*\*空
50
解\*n
30
\*亮
15
lr\*s
50
S\*e
8.8
\`
@@ -0,0 +1,61 @@
---
page-title: "How do I install a root certificate? - Ask Ubuntu"
url: https://askubuntu.com/questions/73287/how-do-i-install-a-root-certificate
date: "2023-03-30 16:38:30"
---
[
![Sparky1's user avatar](https://www.gravatar.com/avatar/6165bb851740276122c7ba3bf5310906?s=64&d=identicon&r=PG)
](https://askubuntu.com/users/31155/sparky1)
4
Given a CA certificate file `foo.crt`, follow these steps to install it on Ubuntu:
1. Create a directory for extra CA certificates in `/usr/local/share/ca-certificates`:
```
sudo mkdir /usr/local/share/ca-certificates/extra
```
2. Copy the CA `.crt` file to this directory:
```
sudo cp foo.crt /usr/local/share/ca-certificates/extra/foo.crt
```
3. Let Ubuntu add the `.crt` file's path relative to `/usr/local/share/ca-certificates` to `/etc/ca-certificates.conf`:
```
sudo dpkg-reconfigure ca-certificates
```
To do this non-interactively, run:
```
sudo update-ca-certificates
```
In case of a `.pem` file on Ubuntu, it must first be converted to a `.crt` file:
```
openssl x509 -in foo.pem -inform PEM -out foo.crt
```
Or a `.cer` file can be converted to a `.crt` file:
```
openssl x509 -inform DER -in foo.cer -out foo.crt
```
[
![BeastOfCaerbannog's user avatar](https://i.stack.imgur.com/IRB44.jpg?s=64&g=1)
](https://askubuntu.com/users/618353/beastofcaerbannog)
answered Jan 12, 2012 at 12:37
@@ -0,0 +1,105 @@
---
page-title: "How to Install AMD OpenCL Mining Drivers on Debian 11 Bullseye"
url: https://dazeb.uk/how-to-install-amd-opencl-mining-drivers-on-debian-11/
date: "2023-03-27 17:27:49"
---
This is a new one that works great and Debian is a super stable Linux variation thats mostly compatible with Ubuntu but does not include any bleeding edge software. Debian is stable and thats the whole point. Its great for server installations and mining rigs.
Lets install Debian 11.
You can install Debian 11 from USB using programs like [Ventoy](https://www.ventoy.net/), [Rufus](https://rufus.ie/en/)
If you are using Linux you can write the image using dd.
`sudo dd if=debian-11.3.0-amd64-netinst.iso of=/dev/sd* bs=1024k status=progress`
You will be asked if you want to install a desktop environment during the installation. The preferred option is to use the desktop environment with XFCE and SSH.
![Debian 11 Desktop installer image](https://mlufdnrmzupp.i.optimole.com/w:800/h:600/q:mauto/f:avif/https://dazeb.uk/wp-content/uploads/2022/04/VirtualBox_debian_19_04_2022_00_12_15.png.webp)
Debian 11 Xfce Desktop Installer
Once completed you will be presented with the desktop. I use the root account for this install.
Open the terminal and do an update to check its fully updated.
`apt update && apt-upgrade -y`
## Add Non-Free Repository Sources
Add the non-free repositories to Debian `/etc/apt/sources.list`
You can use `nano /etc/apt/sources/list`
Edit the file to look like the below. You are just adding `contrib non-free` to each line.
```
deb http://deb.debian.org/debian/ bullseye main contrib non-free
deb-src http://deb.debian.org/debian/ bullseye main contrib non-free
deb http://security.debian.org/debian-security bullseye-security main contrib non-free
deb-src http://security.debian.org/debian-security bullseye-security main contrib non-free
# bullseye-updates, to get updates before a point release is made;
# see https://www.debian.org/doc/manuals/debian-reference/ch02.en.html#_updates_and_backports
deb http://deb.debian.org/debian/ bullseye-updates main contrib non-free
deb-src http://deb.debian.org/debian/ bullseye-updates main contrib non-free
```
## Installing AMD GPU Firmware
Update the packages. Feel free to fully update and upgrade if you like. It wont make any difference.
```
apt update
```
Next, we install the non-free graphic cards drivers with:
```
apt install firmware-linux-nonfree
```
**You may get some errors about missing firmware**. You can safely ignore it we wont be needing it anyway.
Non-free means, not open source, AMD drivers are proprietary so hence the non-free part. It doesnt mean you have to pay anything means that the software cannot be distributed and or modified, sold etc.
## Downloading AMD GPU OpenCL Drivers
Next, we can go down the familiar route explained in previous guides. Download the old AMD drivers and install them with the following commands.
```
# Change to a directory to download the file
cd Downloads
# Download the tar file of AMD drivers
wget https://drivers.amd.com/drivers/linux/amdgpu-pro-20.40-1147286-ubuntu-20.04.tar.xz --referer https://www.amd.com/en/support/kb/release-notes/rn-amdgpu-unified-linux-20-40
# unzip the tar
tar -xJpf amdgpu-pro-*.tar.xz
# cd into the directory
cd amdgpu-pro-20.40-1147286-ubuntu-20.04
```
## Installing AMD GPU OpenCL Drivers
Next, the command to install only the OpenCL drivers
```
./amdgpu-install --opencl=legacy --headless --no-dkms
```
The command should complete without error.
At this point, you can use `clinfo` to see if it recognises your gfx card.
```
apt install clinfo
clinfo
```
Your computer should be mining now using Debian 11. This method was tested on RX 580 and works every time.
## Complete!
At this point, you could install CoreCtl to overclock your cards in a GUI application.
The Install for CoreCtl is at the [bottom of another guide I wrote](https://dazeb.uk/how-to-install-amd-opencl-gpu-drivers-on-ubuntu-21-04-for-mining-ethereum/#corectl).
@@ -0,0 +1,246 @@
---
page-title: "HowTos/LDAP authentication for Atlassian JIRA using FreeIPA - FreeIPA"
url: https://www.freeipa.org/page/HowTos/LDAP_authentication_for_Atlassian_JIRA_using_FreeIPA
date: "2023-03-06 15:19:17"
---
[Template:Draft](https://www.freeipa.org/index.php?title=Template:Draft&action=edit&redlink=1 "Template:Draft (page does not exist)") Draft / Work in Progress on formatting
- [1 Introduction](https://www.freeipa.org/page/HowTos/LDAP_authentication_for_Atlassian_JIRA_using_FreeIPA#Introduction)
- [2 Integration Path](https://www.freeipa.org/page/HowTos/LDAP_authentication_for_Atlassian_JIRA_using_FreeIPA#Integration_Path)
- [3 Toolset](https://www.freeipa.org/page/HowTos/LDAP_authentication_for_Atlassian_JIRA_using_FreeIPA#Toolset)
- [4 Key Challenges](https://www.freeipa.org/page/HowTos/LDAP_authentication_for_Atlassian_JIRA_using_FreeIPA#Key_Challenges)
- [4.1 LDAP Adapter Type](https://www.freeipa.org/page/HowTos/LDAP_authentication_for_Atlassian_JIRA_using_FreeIPA#LDAP_Adapter_Type)
- [4.1.1 Other Candidate Adapters](https://www.freeipa.org/page/HowTos/LDAP_authentication_for_Atlassian_JIRA_using_FreeIPA#Other_Candidate_Adapters)
- [4.2 RFC Schemas + FreeIPA Trees](https://www.freeipa.org/page/HowTos/LDAP_authentication_for_Atlassian_JIRA_using_FreeIPA#RFC_Schemas_.2B_FreeIPA_Trees)
- [4.3 E-Mail Attribute and Bind Type](https://www.freeipa.org/page/HowTos/LDAP_authentication_for_Atlassian_JIRA_using_FreeIPA#E-Mail_Attribute_and_Bind_Type)
- [4.4 Replicating Users and Groups](https://www.freeipa.org/page/HowTos/LDAP_authentication_for_Atlassian_JIRA_using_FreeIPA#Replicating_Users_and_Groups)
- [4.4.1 Users](https://www.freeipa.org/page/HowTos/LDAP_authentication_for_Atlassian_JIRA_using_FreeIPA#Users)
- [4.4.2 Groups](https://www.freeipa.org/page/HowTos/LDAP_authentication_for_Atlassian_JIRA_using_FreeIPA#Groups)
- [5 The Final Configuration](https://www.freeipa.org/page/HowTos/LDAP_authentication_for_Atlassian_JIRA_using_FreeIPA#The_Final_Configuration)
## Introduction
This page describes how to integrate JIRA to a FreeIPA LDAP server. Very likely the same approach can be taken to integrate other Atlassian products such as Confluence to FreeIPA.
JIRA offers a number of different ways to integrate to LDAP. Unfortunately FreeIPA integration is not natively supported, but once you know how, it is not that difficult. There are probably other solutions that work as well, but this is the one that worked for us.
At the time of integration we were running FreeIPA Server 4.1.0 and JIRA 6.4.7
See:
[https://confluence.atlassian.com/display/JIRA/Connecting+to+an+LDAP+Directory](https://confluence.atlassian.com/display/JIRA/Connecting+to+an+LDAP+Directory) [https://confluence.atlassian.com/display/DEV/How+to+write+LDAP+search+filters](https://confluence.atlassian.com/display/DEV/How+to+write+LDAP+search+filters)
## Integration Path
JIRA can be integrated to an LDAP by a number of different paths including full bi-directional sync.
We chose **Internal Directory with LDAP Authentication**, which means that FreeIPA users and groups are copied to the JIRA internal directory when a FreeIPA user logs in to JIRA. i.e.
- FreeIPA is used for authentication
- FreeIPA users, and optionally groups + group membership are replicated one-way to JIRA on user login.
In particular this means that only a subset of the FreeIPA users will be replicated to JIRA - only those that actually log in to JIRA.
See [https://confluence.atlassian.com/display/JIRA/Connecting+to+an+Internal+Directory+with+LDAP+Authentication](https://confluence.atlassian.com/display/JIRA/Connecting+to+an+Internal+Directory+with+LDAP+Authentication)
Much of the config described below could probably be used for the other integration paths.
## Toolset
We used the following tools to gain insight into the structure of the FreeIPA LDAP directory, and to understand and simulate the queries that JIRA (might) be making against FreeIPA
- **Apache Directory Studio:** This or any similar visual LDAP browser is invaluable to getting into the guts of an LDAP, seeing what is where, which attributes are available (and even making changes in extremis). See [https://directory.apache.org/studio/](https://directory.apache.org/studio/)
- **ldapsearch:** This command line tool is your friend! Use it to simulate queries that JIRA might be making, fine tune filters, and see what FreeIPA returns. This approach helped us to see that we were initially getting results from both the compat and accounts trees - which confused JIRA, and then how to prevent this.
- **FreeIPA and JIRA logs:** What queries is JIRA actually making? Although you can guesstimate based on your config, it is great to see the actual queries.
- FreeIPA Server: /var/log/dirsrv/slapd-\*/access
- JIRA: See [https://confluence.atlassian.com/display/JIRA/Logging+and+Profiling](https://confluence.atlassian.com/display/JIRA/Logging+and+Profiling) We added the package com.atlassian.crowd.directory.SpringLDAPConnector, and got partial results.
## Key Challenges
### LDAP Adapter Type
While JIRA offers a wide range of LDAP Adapters, it does not (yet) offer a FreeIPA Adapter out of the box. We chose the Generic LDAP adapter, and were able to configure this for FreeIPA.
#### Other Candidate Adapters
- **FedoraDS:** We did NOT use the FedoraDS adapter (even though FedoraDS is an ancestor of FreeIPA), as this uses the compat tree due to the (objectclass=posixAccount) filter. However other freeIPA users have reported success with this adapter: [https://www.redhat.com/archives/freeipa-users/2015-June/msg00200.html](https://www.redhat.com/archives/freeipa-users/2015-June/msg00200.html)
- **Other Adapters:** It is possible that other adapters can also be persuaded to work, with more or less additional configuration.
### RFC Schemas + FreeIPA Trees
There are several different LDAP RFC Schemas. FreeIPA uses the RFC 2307bis schema (with users stored under cn=accounts, cn=users), but also offers publishes an alternative "compat" tree cn=users,cn=compat,dc=example,dc=com with users in a RFC 2307 schema.
The chosen adapter, and the configuration applied to it, plays an important role here in determining which of the trees returns data. Here using ldapsearch was invaluable. For example it proved that in one of our first attempt we were getting returns from both trees, and that JIRA was using only the first return.
Making the query with the correct filter gave us data from the desired tree (cn=accounts, cn=users). The ldap.user.filter (objectclass=inetorgperson) ensures that replies DO NOT come from the compat tree (which among other things does not have the mail attribute).
See [https://www.freeipa.org/page/Directory\_Server](https://www.freeipa.org/page/Directory_Server) and [https://www.redhat.com/archives/freeipa-users/2015-June/msg00547.html](https://www.redhat.com/archives/freeipa-users/2015-June/msg00547.html)
### E-Mail Attribute and Bind Type
We managed to get users synced from FreeIPA, and able to authenticate and thus log in to JIRA fairly easily. However the email field was empty, which means that JIRA mail notification didn't work, rendering JIRA about as useful as a chocolate teapot. While the email field could be updated in the JIRA user management, it always emptied every time the user logged back on.
Once again ldapsearch proved what was going on: We had configured the LDAP Adapter without a user: i.e. anonymous bind. Performing the same query via simple bind: i.e. with an LDAP user, returned additional attributes, including the all important mail attribute. We therefore reconfigured the LDAP Adapter to use a FreeIPA user and password, and bingo! JIRA received the mail attribute!
As the password of the bind user is stored in plaintext in the jira database, make sure the user configured is a limited user (member of the default ipa-users group is sufficient). e.g. don't use the Directory Manager user!
### Replicating Users and Groups
#### Users
It is possible to replicate only the users to JIRA, with groups managed locally (you can configure default groups to which user are added automatically). We did this as a first step.To get this to work change:
- **User Schema Settings / Additional User DN** to cn=accounts
- **User Schema Settings / User Unique ID Attribute** from entryUUID to uid
#### Groups
Additionally groups, and group memberships can be replicated to JIRA. To get this to work change:
- **Group Schema Settings / Additional Group DN** to cn=accounts
- **Group Schema Settings / Group Object Class** from groupOfUniqueNames to groupOfNames
- **Group Schema Settings / Group Object Filter** from (objectclass=groupOfUniqueNames) to (objectclass=groupOfNames)
- **Member Schema Settings / Group Members Attribute** from uniqueMember to Member
## The Final Configuration
Below is the config direct from the Jira database (of course we made the config changes via the Jira admin GUI, which has a nifty Test function).
Note: you will need to change some values to reflect your domain, hostname etc
mysql> select attribute\_name, attribute\_value from cwd\_directory\_attribute where directory\_id = xxxx;
**Attribute Name**
**Attribute Value**
autoAddGroups
jira-users
crowd.delegated.directory.auto.create.user
true
crowd.delegated.directory.auto.update.user
true
crowd.delegated.directory.importGroups
true
crowd.delegated.directory.type
com.atlassian.crowd.directory.GenericLDAP
ldap.basedn
dc=my,dc=silly,dc=example,dc=com
ldap.external.id
uid
ldap.group.description
description
ldap.group.dn
cn=accounts
ldap.group.filter
(objectclass=groupOfNames)
ldap.group.name
cn
ldap.group.objectclass
groupOfNames
ldap.group.usernames
Member
ldap.nestedgroups.disabled
true
ldap.pagedresults
false
ldap.pagedresults.size
1000
ldap.password
*<password of the bind user>*
ldap.referral
false
ldap.url
ldap:/*/<hostname of your FreeIPA Server>*.my.silly.example.com:389
ldap.user.displayname
displayName
ldap.user.dn
cn=accounts
ldap.user.email
mail
ldap.user.filter
(objectclass=inetorgperson)
ldap.user.firstname
givenName
ldap.user.group
memberOf
ldap.user.lastname
sn
ldap.user.objectclass
inetorgperson
ldap.user.username
uid
ldap.user.username.rdn
uid
ldap.userdn
uid=*<uid of the bind user>*,cn=users,cn=accounts,dc=my,dc=silly,dc=example,dc=com
ldap.usermembership.use
false
ldap.usermembership.use.for.groups
false
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,402 @@
---
page-title: "Openwrt 作为旁路网关(不是旁路由、单臂路由)的终极设置方法,破解迷思 - 少数派"
url: https://sspai.com/post/68511
date: "2023-03-29 12:53:38"
---
> 副标题:以x86、斐讯N1、树莓派为例。旁路网关的性能到底重不重要?
先说结论:
> 旁路网关不会影响局域网性能,也不会影响广域网下行性能。因此,使用旁路网关的主要目的如果只是用来转发代理上网的流量,旁路网关的性能并不重要。测试可见文末。
破解迷思:
1. 旁路网关**不需要**取消br-lan**不需要**复用eth0添加wan口!
2. 旁路网关**不需要**打开防火墙的lan->wan IP动态伪装(POSTROUTING MASQUERADE)!
这两种做法都是网上常见错误设置方法,不是标准的“旁路网关”拓扑(那样做实际上是“单臂路由”),不能发挥局域网的最佳性能。具体设置方法可见文末。
**获取、编译 Openwrt 固件**
不要觉得困难,因为我已经帮你编译好了。
相比于官方镜像,我这个固件主要是定制和集成了一些内核模块、应用软件,更好兼容本文推荐的路由设备,更符合国内使用场景的需求。与其它一些第三方固件相比,最大的特点是:简洁。它只是为了做路由、网关而定制的固件,没有其它乱七八糟的非必须功能。
当然,如果你想加入其它软件,并且编译自己的版本,也是非常简单的。
利用 Github Actions 提供的免费集成功能,每周五会自动生成最新固件,提供下载和升级方法。
👇可以去我的软件仓库了解并获取固件👇
[Build Openwrt Firmware](https://sspai.com/link?target=https%3A%2F%2Fgithub.com%2Friverscn%2Fbuild-openwrt-firmware)
![](https://cdn.sspai.com/2021/08/28/article/56225dd110cc39fb13ec7517e568a7a6?imageView2/2/w/1120/q/40/interlace/1/ignore-error/1)
Bootstrap 主题
![](https://cdn.sspai.com/2021/08/28/article/844059b51039f2c7840add468ec168b1?imageView2/2/w/1120/q/40/interlace/1/ignore-error/1)
Argon 主题
**常见路由设备刷写/升级 Openwrt 固件**
Openwrt 固件通常是一个镜像文件,以 img 或 img.gz 为后缀。
主要刷写方式如下:
 
可从外部存储启动
不可从外部存储启动
**没有内部存储**
直接将固件写入存储设备
(不存在这样的机器)
**内部存储可拆卸**
拆下内部存储,直接将固件写入
拆下内部存储,直接将固件写入
**内部存储不可拆卸**
通过外部存储启动,再将固件写入内部存储
通过原厂系统刷入factory固件转换,或其它刷机方式
将镜像写入可移动存储设备的工具:[Etcher](https://sspai.com/link?target=https%3A%2F%2Fwww.balena.io%2Fetcher%2F)
## **X86**
X86 是最简单的,[官方有详细说明](https://sspai.com/link?target=https%3A%2F%2Fopenwrt.org%2Fdocs%2Fguide-user%2Finstallation%2Fopenwrt_x86)。
简单来说,先把设备的内置存储设备拆下来,通过USB转接的方式连接到你的电脑上。然后使用 [Etcher](https://sspai.com/link?target=https%3A%2F%2Fwww.balena.io%2Fetcher%2F) 写入镜像文件,再把存储设备装回去,就能启动了。
也有其它方式,比如先用一个 Ubuntu Live U盘在要安装 Openwrt 的设备上启动,在设备上将解压后的img镜像写入内置存储。命令是 `dd if=openwrt-18.06.1-x86-64-generic-ext4-combined.img of=/dev/xxx`
后续升级可以通过 Openwrt 内置的系统/升级功能进行。
> 网上有售x86“工控机”,具备多个网口,很适合作为路由器。在2021年,我建议你购买J4125 CPU的机器作为软路由,售价大约1000元左右。性能是NAS级的,你想用它跑任何家庭网络服务压力都不大。
> 也可以考虑购买“迷你主机”,和工控机并没有本质区别。对于X86电脑来说,网口不够用也没关系,通过USB3.0可以扩展USB网卡,1Gbps或2.5Gbps网卡都没问题。
> 你甚至可以用虚拟机跑 Openwrt 来作为路由设备,复用你现有的电脑。
## **单片机:以树莓派为例**
树莓派也非常简单,因为它是通过SD卡启动的。使用 [Etcher](https://sspai.com/link?target=https%3A%2F%2Fwww.balena.io%2Fetcher%2F) 向SD卡写入镜像文件,插卡就能启动了。[官方有详细说明](https://sspai.com/link?target=https%3A%2F%2Fopenwrt.org%2Ftoh%2Fraspberry_pi_foundation%2Fraspberry_pi)。
后续升级可以通过 Openwrt 内置的系统/升级功能进行。
其它型号的单片机,包括像 NanoPi [R2S](https://sspai.com/link?target=https%3A%2F%2Fwiki.friendlyarm.com%2Fwiki%2Findex.php%2FNanoPi_R2S%2Fzh)/[R2C](https://sspai.com/link?target=http%3A%2F%2Fwiki.friendlyarm.com%2Fwiki%2Findex.php%2FNanoPi_R2C%2Fzh)/[R4S](https://sspai.com/link?target=https%3A%2F%2Fwiki.friendlyarm.com%2Fwiki%2Findex.php%2FNanoPi_R4S%2Fzh),已获得 Openwrt 官方支持,获取固件和刷写也非常容易。
> 在全球芯片短缺的2021年,曾经250元左右一片的2G树莓派4B,卖到了近500元。树莓派4的性能作为路由器非常合适,本来这是一个值得考虑的选项,但现在,显得非常鸡肋了。建议等 芯片供应正常再购买。
> 还有很火的 NanoPi R系列,价格也涨了近一倍……建议观望,玩ARM单片机,本来就是图的便宜好玩,太贵了不如玩x86。
> 树莓派4B包含了两个USB3.0接口,因此可以用它来扩展USB网卡。而树莓派3B的网络接口连千兆都跑不满,不推荐使用比4B性能更差的型号来作为路由设备。
## **其它“电视盒子”:以斐讯N1为例**
斐讯N1可能需要降级并刷写改版固件,然后从U盘启动,再通过安装脚本来安装。该方式由 webpad 提供,可[参考其帖子](https://sspai.com/link?target=https%3A%2F%2Fwww.right.com.cn%2Fforum%2Fthread-340279-1-1.html)进行操作。
如果嫌麻烦,建议你买个刷好的二手。
降级后的N1可以通过刷入 Openwrt 固件的U盘启动,并将其刷入内置EMMC存储。在[我提供的固件](https://sspai.com/link?target=https%3A%2F%2Fgithub.com%2Friverscn%2Fbuild-openwrt-firmware)中,其刷写命令为 `/root/install-to-emmc.sh` ,脚本由 flippy 提供。
> 斐讯N1以及一些外贸盒子,都是可能在闲鱼捡到便宜货的。我手里的N1是在斐讯倒闭前,闲鱼新品甩卖时,80元的价格购买的,非常香。而现在,它可能要买接近200元,不那么香了……
> 这些电视盒子刷入 Openwrt 固件的方法,可能需要你在网上参考一下别人的经验。
> 在所有这些盒子中,性能的排序参考 flippy 的总结:amliogic s922x(代表产品:GT-King、GT-King Pro,目前性能最强的arm盒子) > rockchip rk3399 > amlogic s905x3(代表产品:X96Max+Hk1Box,H96 Max x3) > amlogic s912(代表产品:章鱼星球, 单核与N1差不多,但核数更多) > amlogic s905x2(代表产品:X96Max) = allwinner h6(代表产品:微加云)> s905x或s905d(代表产品:N1) > rk3328(代表产品:我家云、贝壳云)
## **给“硬路由”刷 Openwrt**
本文不涉及硬路由刷 Openwrt。其方式往往是通过先刷入“factory”版 Openwrt 镜像,往后再用“sysupgrade”版镜像,来实现转为 Openwrt 启动的。[官方有详细说明](https://sspai.com/link?target=https%3A%2F%2Fopenwrt.org%2Fdocs%2Fguide-user%2Finstallation%2Fstart)。
> 非常不推荐给成品无线路由(硬路由)刷 Openwrt,基本上都会影响无线性能和稳定性。建议你把它设置成AP模式,用原厂固件,安安静静提供无线接入点就好。Openwrt 还是要买个软路由来跑。
**主路由 vs 旁路网关**
要实现最佳体验,需要注意根据以下情况进行选择:
条件
主路由模式
旁路网关模式
需要替换现有的主路由
需要
不需要
运行 Openwrt 的设备具有较高性能
需要
不需要
运行 Openwrt 的设备具备多个物理网络接口,且带宽足够
需要
不需要
如果不能满足任意其一,建议选择旁路网关模式。
不过世上哪有那么好的事,旁路网关虽然需要满足的条件较少,但也有其劣势,可参考文末的测试。
## **把 Openwrt 作为主路由**
这是常用模式,该模式下,所有设备的网关指向主路由IP,并且主路由作为DHCP服务器、DNS服务器。
![](https://cdn.sspai.com/2021/08/28/ba386ac7121a9863987763f303250e4c.png?imageView2/2/w/1120/q/40/interlace/1/ignore-error/1)
主路由模式
如果运行 Openwrt 的设备有2个及以上的物理网络接口,推荐该模式。这是标准的局域网拓扑结构,所有的设备都能获得全双工的传输速率,所有流量都不会“走弯路”。
安装方式也很简单,用 Openwrt 路由器作为主路由就行了。
## **把 Openwrt 作为旁路网关**
但有时候,Openwrt 设备可能只有1个物理网络接口,但又想利用 Openwrt 扩展现有网络的功能,就可以用“旁路网关”的方式实现。
旁路网关的好处是不需要修改现有网络基础设施,只需要在标准的局域网拓扑结构中,增加一个网关设备就行了。网关设备和一个普通的局域网设备在结构上是同等地位。所以也适用于不太好替换现有主路由的情况。
![](https://cdn.sspai.com/2021/08/28/34271393ce691de113e6f3138ff369e1.png?imageView2/2/w/1120/q/40/interlace/1/ignore-error/1)
旁路网关模式
旁路官关有两种利用方式:
1. 按需手动设置,只让指定的设备通过旁路网关访问Internet。
2. 接管局域网的所有上网流量。
方式1不需要修改主路由配置,但需要修改客户端设备的网络设置。
方式2需要修改主路由配置,不需要修改客户端设备的网络设置。
两种方式均不影响局域网内的流量路径,局域网设备互访都是直通的(不会经过路由器或网关)。
**基本设置**
## **作为主路由的设置方法**
作为主路由是 Openwrt 的默认设置,这里不必多讲。
Openwrt 可以实现诸多高级特性,诸如多WAN、[IPTV融合](https://sspai.com/link?target=https%3A%2F%2Fblog.lishun.me%2Fiptvhelper-guide)等。这些都是做旁路网关时无法实现的功能。
## **作为旁路网关的设置方法**
### 旁路网关自身的基础设置
刷好固件的新 Openwrt 网关,一般默认的IP地址是192.169.1.1。你可以通过WiFi或网线,**确保电脑只连接了它**,就可以访问该管理地址了。
1. 在“网络”-“接口”的“常规设置”中给 Openwrt 的 LAN 网络接口设置一个和现有局域网同网段的静态 IP 地址,注意不要和现有设备的 IP 地址冲突。然后应用设置。
2. 将 LAN 网络接口的“默认网关”设为主路由的 IP 地址。
3. 在“高级设置”中找到“使用自定义的 DNS 服务器”设为主路由的 IP 地址。
4. 在“DHCP 服务器”中勾选“忽略此接口”。
5. 在“DHCP 服务器”-“IPv6 设置”中禁用所有IPv6服务。
6. 点击“保存”以及“保存并应用”。
7. 在“网络”-“防火墙”中,关闭“SYN-flood 防御”,点击“保存并应用”。
8. 建议重启一次。
![](https://cdn.sspai.com/2021/08/31/5f7514021f5bb55b9d0ab5d86b5c453b.jpg?imageView2/2/w/1120/q/40/interlace/1/ignore-error/1)
如果你是通过WiFi接入点访问的,现在可以插上网线,通过有线局域网来访问它了。记得**删除WiFi接入点**以降低路由器的温度。
至此,它已经是一个合格的旁路网关了。
接下来有两种使用方式,根据偏好选择。
### 方式一:指定的设备才使用旁路网关
在指定的设备上,手动设置IP地址,将其“网关”和“首选 DNS”改为旁路网关的IP地址。
![](https://cdn.sspai.com/2021/08/28/article/254c2b0ee0718a890ee2f856a04a596c?imageView2/2/w/1120/q/40/interlace/1/ignore-error/1)
### 方式二:所有设备都使用旁路网关
**重要的事说三遍:在主路由上设置,在主路由上设置,在主路由上设置**
如果**主路由**是 Openwrt 固件,找到 br-lan 网络接口,在“DHCP 服务器”的“高级设置”中添加两个选项:
- 3,你的网关IP
- 6,你的网关IP
![](https://cdn.sspai.com/2021/08/28/article/68617e786d195625027550dafde2834a?imageView2/2/w/1120/q/40/interlace/1/ignore-error/1)
注意,这是主路由的设置,不是旁路网关!
如果是其它固件的主路由,或者成品路由器,找到类似“DHCP 服务器”的设置,在其中指定**默认网关**和**默认DNS服务器**是你的网关IP就行。
**性能测试,旁路网关的性能到底重不重要?**
## **测试局域网传输性能**
通过ssh命令 `ssh root@你的路由器ip` 进入到路由器的命令行界面。
`opkg update && opkg install iperf3` 安装 iperf3 测试软件。
`iperf3 -s` 运行测试。
在局域网的另一台机器上,同样安装 [iperf3](https://sspai.com/link?target=https%3A%2F%2Fiperf.fr%2Fiperf-download.php) 软件。
```
iperf3 -c 你的路由器ip
iperf3 -c 你的路由器ip -R
```
运行测试。先是测试的路由器从测试机下载数据的性能,再测试的是反过来的性能。
这是我测试的自己的树莓派4B的性能:
```
$ iperf3 -c 192.168.1.3
[ ID] Interval Transfer Bandwidth
[ 4] 0.00-10.00 sec 1.10 GBytes 949 Mbits/sec sender
[ 4] 0.00-10.00 sec 1.10 GBytes 949 Mbits/sec receiver
$ iperf3 -c 192.168.1.3 -R
Reverse mode, remote host 192.168.1.3 is sending
[ ID] Interval Transfer Bandwidth Retr
[ 4] 0.00-10.00 sec 1.10 GBytes 944 Mbits/sec 0 sender
[ 4] 0.00-10.00 sec 1.10 GBytes 944 Mbits/sec receiver
```
## **通过 netdata 软件监控性能状况**
在路由器中运行 `opkg update && opkg install netdata` 安装 netdata 监控软件。或者在“系统/软件包”菜单中安装。
然后在浏览器上访问 `http://路由器ip:19999` 就可以了
## **测试广域网转发性能、代理转发性能**
在 netdata 中点击右上角 Settings 关闭 On Focus。
同时启动一个测速软件,例如 Speedtest.net,跑一跑,看看性能如何?
我们来验证一下,上文所说的,各种流量情况下,主路由和旁路网关的负载情况?
(我家的宽带标称500M,上行标称100M)
### 1\. 广域网下行流量
主路由负责转发流量,旁路网关围观。
![](https://cdn.sspai.com/2021/08/28/article/05b34c1d0b4a58ea077ae6e020a1ffde?imageView2/2/w/1120/q/40/interlace/1/ignore-error/1)
测试设备:树莓派4B(下面的仪表盘)
旁路网关真的在围观吗?我想了个办法,在树莓派上跑iperf3,把它的出站流量占满,同时开始广域网下行。
![image.png](https://cdn.sspai.com/2021/08/29/article/4ce282ccc3bf669df7e9e16316262f56?imageView2/2/w/1120/q/40/interlace/1/ignore-error/1)
测试设备:树莓派4B
我们再来看看斐讯N1的表现。N1的网卡没有硬件流控功能,所以可能会引起问题,而软件流控损失性能。在运行flippy的固件安装脚本时,会问你选择是否用`*-thresh.dtb`开启软件流控,默认不采用。
我们来实测一下。N1有一个USB2.0接口,接上网卡,对网速进行物理封印!便于观察网关是否真的不影响下行流量。
![](https://cdn.sspai.com/2021/08/28/article/a4716e6f19036d629bbea3e3c6f3406f?imageView2/2/w/1120/q/40/interlace/1/ignore-error/1)
斐讯N1+USB2.0网卡,物理封印网速
我在另一台电脑上不停地iperf3占满N1的网络带宽,同时在旁路网关的客户端电脑上测速。
![](https://cdn.sspai.com/2021/08/28/article/48662094fff67c3a0ee5e4ada9bb1c5b?imageView2/2/w/1120/q/40/interlace/1/ignore-error/1)
测试设备:斐讯N1+USB2.0网卡
神奇的事情发生了!网关并没有完全在围观,它的iperf3传输速度显然受到了影响。但客户端并没有受到影响,测速显然已经突破USB2.0的速率限制了。
结论:
- 广域网下行流量速率不受旁路网关性能的影响
- N1在关闭软件流控时,因为没有硬件流控功能,所以可能会被局域网中的其它流量干扰。会有一定影响自身性能,但不影响局域网其它设备的性能。作为旁路网关,在这一点上,树莓派完胜。
### 2\. 广域网上行流量
主路由和旁路网关同时在转发流量。
![](https://cdn.sspai.com/2021/08/28/article/e8dfaab604c9a6df667c3e5235963197?imageView2/2/w/1120/q/40/interlace/1/ignore-error/1)
测试设备:树莓派4B(下面的仪表盘)
### 3\. 代理转发流量
![](https://cdn.sspai.com/2021/08/28/article/15070bcd362a765487749f74c3989c83?imageView2/2/w/1120/q/40/interlace/1/ignore-error/1)
我使用的是 Xray VLESS XTLS
只测试下行就好,上行肯定会经过旁路网关的。
![](https://cdn.sspai.com/2021/08/29/article/1f9994750fd5adfed8fe4169deacf1b4?imageView2/2/w/1120/q/40/interlace/1/ignore-error/1)
测试设备:树莓派4B(下面的仪表盘)
看这个测试结果,难道说,代理转发的下行流量并不需要经过旁路网关的转发吗?想想并不可能啊。
换fast.com再试试……可以发现,代理转发流量经过了N1。
![](https://cdn.sspai.com/2021/08/29/article/f3d2dc4f53a29e49742b23a2733f73fd?imageView2/2/w/1120/q/40/interlace/1/ignore-error/1)
测试设备:N1
所以破案了!原来speedtest.net不知为何并没有经过代理,不要相信它!所以不要用它做代理速度测试了,可能是不准的。
至此,通过实践证实了以下结论:
优劣对比
主路由模式
旁路网关模式
局域网流量
不影响性能
不影响性能
广域网下行流量
受限于主路由NAT转发性能
受限于主路由NAT转发性能
广域网上行流量
受限于主路由NAT转发性能
同时受限于主路由和旁路网关NAT转发性能
代理上网转发流量
外加受限于主路由CPU性能
同时受限于主路由和旁路网关NAT转发性能,外加旁路网关CPU性能
最后,可以有理有据地得出如何选择旁路网关的结论:
1. 旁路网关的网卡带宽只要不低于你的上传带宽,就不会对普通流量造成瓶颈。考虑到国内的上行带宽通常非常小,所以基本不会造成影响
2. 旁路网关作为代理上网的转发网关,性能下限是由其CPU性能和网卡带宽中最低的部分决定的
所以旁路网关的性能,并不那么重要。忽悠你买高性能旁路网关的,肯定是奸商。
但旁路网关无法负责NAT部分的功能,如果你需要多WAN、IPTV等功能,还是需要一个功能灵活的主路由。但如果你仅仅只是为了转发代理上网流量,实现透明代理,那么旁路网关是个非常经济、简单的选择。
好了,以上就是我这些年来玩 Openwrt 作为家庭网络的路由系统的终极经验了。
工作桌面纪念照:
![](https://cdn.sspai.com/2021/08/28/article/399c1defcfd9ccabcd070d8e1f080be2?imageView2/2/w/1120/q/40/interlace/1/ignore-error/1)
[原文](https://sspai.com/link?target=https%3A%2F%2Fblog.lishun.me%2Fopenwrt-mega-post)发布在我的博客上。
@@ -0,0 +1,130 @@
---
page-title: "Prerequisites | Tauri Apps"
url: https://tauri.app/v1/guides/getting-started/prerequisites
date: "2023-03-23 10:38:20"
---
## Prerequisites
## Installing[](https://tauri.app/v1/guides/getting-started/prerequisites#installing "Direct link to Installing")
The first step is to install [Rust](https://www.rust-lang.org/) and system dependencies. Keep in mind that this setup is only needed for *developing Tauri apps*. Your end-users are not required to do any of this.
### Setting Up Windows[](https://tauri.app/v1/guides/getting-started/prerequisites#setting-up-windows "Direct link to Setting Up Windows")
#### 1\. Microsoft Visual Studio C++ Build Tools[](https://tauri.app/v1/guides/getting-started/prerequisites#1-microsoft-visual-studio-c-build-tools "Direct link to 1. Microsoft Visual Studio C++ Build Tools")
You will need to install Microsoft Visual Studio C++ build tools. The easiest way is to install [Build Tools for Visual Studio 2022](https://visualstudio.microsoft.com/visual-cpp-build-tools/). When asked which workloads to install, ensure "C++ build tools" and the Windows 10 SDK are selected.
![Microsoft Visual Studio Installer](https://tauri.app/assets/images/vs-installer-light-ff9f655b16965d4ac45117fe2f2624e9.png#gh-light-mode-only) ![Microsoft Visual Studio Installer](https://tauri.app/assets/images/vs-installer-dark-03cefd64bd4335f718aacc8f4842d2bb.png#gh-dark-mode-only)
Listing 1-1: Selecting "C++ build tools" and "Windows 10 SDK" using the Visual Studio Build Tools 2022 installer.
#### 2\. WebView2[](https://tauri.app/v1/guides/getting-started/prerequisites#2-webview2 "Direct link to 2. WebView2")
note
On Windows 10 (Version 1803 and later with all updates applied) and Windows 11, the Webview2 runtime is distributed as part of the operating system.
Tauri heavily depends on WebView2 to render web content on Windows, therefore you must have WebView2 installed. The easiest way is to download and run the Evergreen Bootstrapper from [Microsoft's website](https://developer.microsoft.com/en-us/microsoft-edge/webview2/#download-section).
The bootstrapper script will try to determine the correct architecture and version for your system. Still, if you run into issues (especially with Windows on ARM) you can select the correct standalone installer.
#### 3\. Rust[](https://tauri.app/v1/guides/getting-started/prerequisites#3-rust "Direct link to 3. Rust")
Lastly, go to [https://www.rust-lang.org/tools/install](https://www.rust-lang.org/tools/install) to install `rustup` (the Rust installer). Note that you have to restart your terminal, and in some cases, Windows itself, for the changes to take effect.
Alternatively, you could use `winget` to install rustup using the following command in PowerShell:
```
winget install --id Rustlang.Rustup
```
MSVC toolchain as default
For full support for Tauri and tools like [`trunk`](https://trunkrs.dev/) make sure the MSVC Rust toolchain is the selected `default host triple` in the installer dialog. Depending on your system it should be either `x86_64-pc-windows-msvc`, `i686-pc-windows-msvc`, or `aarch64-pc-windows-msvc`.
If you already have Rust installed, you can make sure the correct toolchain is installed by running this command:
```
rustup default stable-msvc
```
### Setting Up macOS[](https://tauri.app/v1/guides/getting-started/prerequisites#setting-up-macos "Direct link to Setting Up macOS")
#### 1\. CLang and macOS Development Dependencies[](https://tauri.app/v1/guides/getting-started/prerequisites#1-clang-and-macos-development-dependencies "Direct link to 1. CLang and macOS Development Dependencies")
You will need to install CLang and macOS development dependencies. To do this, run the following command in your terminal:
#### 2\. Rust[](https://tauri.app/v1/guides/getting-started/prerequisites#2-rust "Direct link to 2. Rust")
To install Rust on macOS, open a terminal and enter the following command:
```
curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh
```
note
We have audited this bash script, and it does what it says it is supposed to do. Nevertheless, before blindly curl-bashing a script, it is always wise to look at it first. Here is the file as a plain script: [rustup.sh](https://sh.rustup.rs/)
The command downloads a script and starts the installation of the `rustup` tool, which installs the latest stable version of Rust. You might be prompted for your password. If the installation was successful, the following line will appear:
```
Rust is installed now. Great!
```
Make sure to restart your terminal for the changes to take effect.
### Setting Up Linux[](https://tauri.app/v1/guides/getting-started/prerequisites#setting-up-linux "Direct link to Setting Up Linux")
#### 1\. System Dependencies[](https://tauri.app/v1/guides/getting-started/prerequisites#1-system-dependencies "Direct link to 1. System Dependencies")
You will need to install a couple of system dependencies, such as a C compiler and `webkit2gtk`. Below are commands for a few popular distributions:
- Debian
- Arch
- Fedora
- openSUSE
- NixOS
```
sudo apt updatesudo apt install libwebkit2gtk-4.0-dev \ build-essential \ curl \ wget \ libssl-dev \ libgtk-3-dev \ libayatana-appindicator3-dev \ librsvg2-dev
```
#### 2\. Rust[](https://tauri.app/v1/guides/getting-started/prerequisites#2-rust-1 "Direct link to 2. Rust")
To install Rust on Linux, open a terminal and enter the following command:
```
curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh
```
note
We have audited this bash script, and it does what it says it is supposed to do. Nevertheless, before blindly curl-bashing a script, it is always wise to look at it first. Here is the file as a plain script: [rustup.sh](https://sh.rustup.rs/)
The command downloads a script and starts the installation of the `rustup` tool, which installs the latest stable version of Rust. You might be prompted for your password. If the installation was successful, the following line will appear:
```
Rust is installed now. Great!
```
Make sure to restart your Terminal for the changes to take effect.
## Managing The Rust Installation[](https://tauri.app/v1/guides/getting-started/prerequisites#managing-the-rust-installation "Direct link to Managing The Rust Installation")
You should keep your Rust version up to date whenever possible to always benefit from the latest improvements. To update Rust, open a terminal and run the following command:
`rustup` can also be used to uninstall Rust from your machine fully:
## Troubleshooting[](https://tauri.app/v1/guides/getting-started/prerequisites#troubleshooting "Direct link to Troubleshooting")
To check whether you have Rust installed correctly, open a shell and enter this command:
You should see the version number, commit hash, and commit date for the latest stable version that has been released in the following format:
```
rustc x.y.z (abcabcabc yyyy-mm-dd)
```
If you don't see this information, your Rust installation might be broken. Please consult [Rust's Troubleshooting Section](https://doc.rust-lang.org/book/ch01-01-installation.html#troubleshooting) on how to fix this. If your problems persist, you can get help from the official [Tauri Discord](https://discord.com/invite/tauri) and [GitHub Discussions](https://github.com/tauri-apps/tauri/discussions).
@@ -0,0 +1,87 @@
---
page-title: "Run an OpenWRT VM on Proxmox VE"
url: https://i12bretro.github.io/tutorials/0405.html
date: "2023-03-27 23:56:45"
---
## What is OpenWRT?
> OpenWrt is an open-source project for embedded operating systems based on Linux, primarily used on embedded devices to route network traffic. The main components are Linux, util-linux, musl, and BusyBox. All components have been optimized to be small enough to fit into the limited storage and memory available in home routers. *-[https://en.wikipedia.org/wiki/OpenWrt](https://en.wikipedia.org/wiki/OpenWrt)*
## Creating the VM
1. Open a web browser and navigate to the ProxMox web UI https://ProxMoxDNSorIP:8006/
2. Click the Create VM button at the top right
3. On the General tab, name the VM OpenWRT and set a VM ID (123 in this example) > click Next
4. On the OS tab select Do not use any media and set the Guest OS Type to Linux and Version to 5.x - 2.6 Kernel > click Next
5. On the System tab click Next
6. On the Hard Disk tab set the Disk size to 0.001 > click Next
7. On the CPU tab set the number of CPU cores and the Type to host > click Next
8. On the Memory tab set the amount of memory to 256 MiB > click Next
9. On the Network tab set the Model field to VirtIO (paravirtualized), Uncheck the Firewall box > click Next
10. On the Confirm tab review the settings and click Finish
11. Select the newly created OpenWRT VM from the left navigation panel
12. Select Hardware from the left sub-navigation menu
13. Click the Hard Disk to select it
14. Click the Detach button at the top of the main content window to detach the hard disk from the VM
15. Click the Unused disk to select it
16. Click the Remove button at the top of the main content window to permanently delete it
17. Click the Add button > Network Device
18. Set the Model field to VirtIO (paravirtualized), Uncheck the Firewall box > Click Add
## Setting Up the OpenWRT Disk
1. Select the Proxmox node name in the left navigation menu
2. Click Shell in the left sub-navigation
3. Run the following commands in the terminal
```bash
\# lookup the latest stable version number
regex='<strong>Current Stable Release - OpenWrt (\[^/\]\*)<\\/strong>' && response=$(curl -s https://openwrt.org) && \[\[ $response =~ $regex \]\] && stableVersion="${BASH\_REMATCH\[1\]}"
\# download openwrt image
wget -O openwrt.img.gz https://downloads.openwrt.org/releases/$stableVersion/targets/x86/64/openwrt-$stableVersion-x86-64-generic-ext4-combined.img.gz
\# extract the openwrt img
gunzip ./openwrt.img.gz
\# rename the extracted img
mv ./openwrt\*.img ./openwrt.raw
\# increase the raw disk to 512 MB
qemu-img resize -f raw ./openwrt.raw 512M
\# import the disk to the openwrt vm
\# update the vm id and storage device as needed
\# usage: qm importdisk
qm importdisk 123 openwrt.raw HDD\_500GB
```
4. **Once the disk import completes, select the OpenWRT VM from the left navigation menu > Hardware**
5. **Double click the Unused Disk > Click the Add button**
6. **Select Options from the left sub-navigation menu**
7. **Double click Boot Order**
8. **Check the Enabled box next to the hard disk**
9. **Drag the Hard disk up in the boot order as needed, typically below the CD-ROM device**
10. **Click OK**
11. **Double click Use tablet pointer > Uncheck the Enabled box > Click OK**
12. **Click the Start button in the top right of the screen**
13. **Click the Console link to watch the boot process**
14. **Wait for the text to stop scrolling and press Enter**
15. **Run the following command to change/set the root password**
**passwd**
16. **Type a new root password twice to set it**
17. **Continue the configuration by running the following commands**
**\# set the lan ip address, use something in the same subnet as your LAN
**uci set network.lan.ipaddr='10.10.27.151'
\# restart network services
service network restart
\# update openwrt packages
opkg update
\# install the luci web ui
opkg install luci
18. **Open a new browser tab and navigate to http://IPofVM, http://10.10.27.151 in the example**
19. **At the login screen, enter the username root and the password set above > Click the Login button**
20. **Enjoy OpenWRT running in Proxmox**
@@ -0,0 +1,28 @@
---
page-title: "SSL with self signed certificate - Drone Support - Harness Community"
url: https://community.harness.io/t/ssl-with-self-signed-certificate/11416/3
date: "2023-03-30 17:16:40"
---
> Here is my configuration for docker-compose.
>
> ```
> drone-runner:
> image: drone/agent:1
> restart: always
> container_name: drone-runner
> volumes:
> - /etc/ssl/certs/ca-certificates.crt:/etc/ssl/certs/ca-certificates.crt:ro
> - /var/run/docker.sock:/var/run/docker.sock
> environment:
> - DRONE_RPC_PROTO=https
> - DRONE_RPC_HOST=xxx
> - DRONE_RPC_SECRET=xxx
> - DRONE_RUNNER_CAPACITY=2
> - DRONE_RUNNER_VOLUMES=/etc/ssl/certs/ca-certificates.crt:/etc/ssl/certs/ca-certificates.crt
> ```
>
> It mounts the ca-certificates.crt file from the host into the runner and from there into the pipeline containers.
---
@@ -0,0 +1,54 @@
---
page-title: "Scope and Shadowing - Rust By Example"
url: https://doc.rust-lang.org/rust-by-example/variable_bindings/scope.html
date: "2023-03-23 13:59:16"
---
## [Scope and Shadowing](https://doc.rust-lang.org/rust-by-example/variable_bindings/scope.html#scope-and-shadowing)
Variable bindings have a scope, and are constrained to live in a *block*. A block is a collection of statements enclosed by braces `{}`.
``` rust
fn main() {
// This binding lives in the main function
let long_lived_binding = 1;
// This is a block, and has a smaller scope than the main function
{
// This binding only exists in this block
let short_lived_binding = 2;
println!("inner short: {}", short_lived_binding);
}
// End of the block
// Error! `short_lived_binding` doesn't exist in this scope
println!("outer short: {}", short_lived_binding);
// FIXME ^ Comment out this line
println!("outer long: {}", long_lived_binding);
}
```
Also, [variable shadowing](https://en.wikipedia.org/wiki/Variable_shadowing) is allowed.
``` rust
fn main() {
let shadowed_binding = 1;
{
println!("before being shadowed: {}", shadowed_binding);
// This binding *shadows* the outer one
let shadowed_binding = "abc";
println!("shadowed in inner block: {}", shadowed_binding);
}
println!("outside inner block: {}", shadowed_binding);
// This binding *shadows* the previous binding
let shadowed_binding = 2;
println!("shadowed in outer block: {}", shadowed_binding);
}
```
@@ -0,0 +1,77 @@
---
page-title: "The ultimate guide to SBOMs | GitLab"
url: https://about.gitlab.com/blog/2022/10/25/the-ultimate-guide-to-sboms/
date: "2023-03-23 17:32:13"
---
![](https://about.gitlab.com/images/blogimages/blog-compliance.jpg)
Modern software development is marked by a commitment to application security not just for code developed in-house, but for the [entirety of the software supply chain](https://about.gitlab.com/blog/2022/08/30/the-ultimate-guide-to-software-supply-chain-security/). However, which upstream dependencies are included in software and the reasons why they are required can be difficult to determine. A software bill of materials, or SBOM, sheds light on an applications contents and code origins, and, when paired with vulnerability management tools, can help identify vulnerabilities and highlight risk for subsequent mitigation. This guide will explain what SBOMs are, their importance in a multi-faceted [DevSecOps](https://about.gitlab.com/topics/devsecops/) strategy, their relationship to vulnerability management, and how to assess and improve an applications SBOM health.
An SBOM is a nested inventory or [list of ingredients that make up software components](https://www.cisa.gov/sbom#). In addition to the components themselves, SBOMs include critical information about the libraries, tools, and processes used to develop, build, and deploy a software artifact.
The SBOM concept has existed [for more than a decade](https://spdx.dev/about/). However, a [2021 Executive Order from the Biden Administration](https://www.whitehouse.gov/briefing-room/presidential-actions/2021/05/12/executive-order-on-improving-the-nations-cybersecurity/) aimed at improving the nations cybersecurity made the term synonymous with software supply chain security and boosted its profile. The U.S. government has [issued mandates](https://about.gitlab.com/blog/2022/03/29/comply-with-nist-secure-supply-chain-framework-with-gitlab/) that require application developers selling to the public sector to include SBOMs with their software packages. The private sector is likely not far behind, sending SBOMs on the path to ubiquity.
Although SBOMs are often created with stand-alone software, platform companies like GitLab are integrating SBOM generation early and deep in the DevSecOps workflow.
![supply chain chart](https://about.gitlab.com/images/blogimages/fast-and-efficient-supply-chain-security-with-rezilion-and-gitlab/sdlc.png)
Modern software development is laser-focused on delivering applications at a faster pace and in a more efficient manner. This can lead to developers incorporating code from open source repositories or proprietary packages into their applications.
Pulling in code from unknown repositories increases the potential for vulnerabilities that can be exploited by hackers. In fact, the [2020 SolarWinds attack](https://www.techtarget.com/whatis/feature/SolarWinds-hack-explained-Everything-you-need-to-know) was sparked by the activation of a malicious injection of code in a package used by SolarWinds Orion product. Customers across the software supply chain were significantly impacted. Other attacks, including the log4j vulnerability that impacted a number of commercial software vendors, cemented the need for a deep dive into application dependencies, including containers and infrastructure, to be able to assess risk throughout the software supply chain.
There is also a cost component to finding and remediating security vulnerability that levels up the need for SBOMs, as well as damage to a companys reputation a software supply chain attack can incur.
> Test your software supply chain security know-how with our quick quiz!
## Types of SBOM data exchange standards[](https://about.gitlab.com/blog/2022/10/25/the-ultimate-guide-to-sboms/#types-of-sbom-data-exchange-standards)
SBOMs work best when their generation and interpretation of information such as name, version, packager, and more are able to be automated. This happens best if all parties use a standard data exchange format.
There are three main types of SBOM data exchange standards in use today:
- OWASP [CycloneDX](https://cyclonedx.org/capabilities/sbom/)
- Software Identification Tagging, or [SWID](https://csrc.nist.gov/projects/Software-Identification-SWID)
- [SPDX](https://spdx.dev/)
GitLab uses CycloneDX for its SBOM generation because the standard is prescriptive and user-friendly, can simplify complex relationships, and is extensible to support specialized and future use cases. In addition, [cyclonedx-cli](https://github.com/CycloneDX/cyclonedx-cli#convert-command) is an open source tool that can be used to convert CycloneDX files to SPDX if necessary.
## Benefits of pairing SBOMs and software vulnerability management[](https://about.gitlab.com/blog/2022/10/25/the-ultimate-guide-to-sboms/#benefits-of-pairing-sboms-and-software-vulnerability-management)
SBOMs are highly beneficial for DevOps teams and software consumers.
- They enable a standard approach to understanding what is in an application and why.
- They provide ongoing visibility into the history of an applications creation, including details about third-party code origins and host repositories.
- The details that SBOMs offer enable a DevOps team to identify vulnerabilities, assess the risk, and then mitigate them.
- SBOMs can deliver the transparency that application purchasers now demand.
## GitLab and SBOMs[](https://about.gitlab.com/blog/2022/10/25/the-ultimate-guide-to-sboms/#gitlab-and-sboms)
For SBOMs to be fully impactful, organizations must be able to automatically generate them, connect them with application security scanning tools, integrate the vulnerabilities and licenses into a dashboard for easy comprehension and actionability, and update them continuously. GitLab supports all of these goals.
Users can find [SBOM capability](https://about.gitlab.com/blog/2022/10/17/fast-and-efficient-sbom-with-gitlab-and-rezilion/) in the Govern Stage under the [Dependency List page](https://docs.gitlab.com/ee/user/application_security/dependency_list/). The GitLab DevSecOps platform is comprehensive as it provides Dependency SBOM and Container SBOM insights.
GitLabs SBOM function enables DevOps teams to scan containers to find operating system, container, and package vulnerabilities in the pipeline and in production. GitLab provides auto-suggested remediations so dev and ops professionals can easily find and fix vulnerabilities. Users can create a vulnerability allow list to reduce noise. The results of the scans, including detected application and language dependencies as well as associated licenses, feed into the dependency list and can be exported. Scan results also can be viewed in GitLabs [Security Center](https://docs.gitlab.com/ee/user/application_security/security_dashboard/) and in Merge Requests.
Developers are able to perform scans early and often in the build, test, and deploy process. From there, they can either dismiss vulnerabilities and add audit trail notes or triage them and then track the remediations with commits. This tight integration ensures that SBOMs can be an integral part of release verification processes.
GitLab also has integrated vulnerability training into the platform so that when vulnerabilities are encountered, developers and security teams can understand the CVEs in context and how to fix them. The platform also supports creation of new policies (and compliance enforcement) based on newly detected vulnerabilities.
DevOps teams who require compliance functionality (ex. [SLSA 2 framework](https://about.gitlab.com/releases/2022/06/22/gitlab-15-1-released/)) can use GitLab to [generate attestation for all build artifacts](https://about.gitlab.com/blog/2022/08/10/securing-the-software-supply-chain-through-automated-attestation/) produced by the GitLab Runner. The process is secure because it is produced by the Runner itself with no handoff of data to an external service.
There is no doubt that as software supply chain security garners more attention, SBOMs will be a focus as well. And although the SBOM industry is evolving quickly, there are still concerns around how SBOMs are generated, the frequency of that generation, where they are stored, how to combine multiple SBOMs for complex applications, how to analyze them, and how to leverage them for application health.
GitLab has made SBOMs an integral part of its [software supply chain direction](https://about.gitlab.com/direction/supply-chain/#overview) and continues to improve upon its SBOM capabilities within the DevSecOps platform, including planning new features and functionality. For instance, GitLab currently plans to have the Runner automate attestation. Also, to reduce the need for users to manage and store their own signing keys, GitLab currently plans to support code signature generation via a short-lived key.
GitLab is expected to soon feature automatic digital signing of build artifacts. Additionally GitLab anticipates supporting the [ingestion of externally generated SBOMs](https://gitlab.com/groups/gitlab-org/-/epics/8024).
The demand for SBOMs is already high. Government agencies increasingly recommend or require SBOM creation for software vendors, federal software developers, and even open source communities. To get ahead of this requirement, check out the SBOM capabilities in [GitLabs DevSecOps platform](https://gitlab.com/-/trials/new).
**Disclaimer This blog contains information related to upcoming products, features, and functionality. It is important to note that the information in this blog post is for informational purposes only. Please do not rely on this information for purchasing or planning purposes. As with all projects, the items mentioned in this blog and linked pages are subject to change or delay. The development, release, and timing of any products, features, or functionality remain at the sole discretion of GitLab.**
[
“Need to get up to speed on SBOMs quickly? We've got you covered with our comprehensive guide” Sandra Gittlen
Click to tweet
](http://twitter.com/share?text=%E2%80%9CNeed+to+get+up+to+speed+on+SBOMs+quickly%3F+We%27ve+got+you+covered+with+our+comprehensive+guide%E2%80%9D+%E2%80%93+%40sandragwrites&url=https://about.gitlab.com/blog/2022/10/25/the-ultimate-guide-to-sboms/)
@@ -0,0 +1,824 @@
---
page-title: "honven - 机场推荐"
url: https://sites.google.com/view/honven/%E9%A6%96%E9%A1%B5/%E6%9C%BA%E5%9C%BA%E6%8E%A8%E8%8D%90
date: "2023-03-15 10:18:52"
---
## 付费机场推荐/SSR-v2ray专线机场评测(2023.3.14更新)
tag:机场推荐,付费机场,专线机场,SS机场,SSR机场,V2ray机场,trojan机场,科学上网,翻墙机场
[Telegram机场观察频道](https://t.me/jichangtj): 最新科学上网相关新闻,最新机场推荐、机场评测 、最新机场优惠通知,可查看下面的机场最新高清测速原图
1.机场就一句话:一分钱一分货! 机场推荐是信息差,不了解的人很容易被坑被推荐很垃圾的机场。下面推荐的机场老板肉身都是在墙外的,相对安全,跑路概率相对较小。
2.机场看的就是线路质量。机场总体线路质量:华为云BGP多入口IEPL内网专线\>普通入口IEPL内网专线>普通公网中转比如广东移动、湖南联通。专线主要是不过墙。速度要看机场的总带宽大小,稳定要看机场的资源质量,解锁看的是机场主的落地/解锁商是否优秀。在保证能流畅看视频前提下,稳定性最重要,然后才是追求更高的速度。一分钱一分货,VPS和线路成本注定了既要稳定又要流量多还要便宜是不可能滴。总体越贵越好,有预算尽量选择有内网专线和BGP入口的,延迟和使用体验都会好很多。
3.尽量买开了比较久的大机场,因为跑路概率较小。小机场可能便宜,但是分分钟跑路。开机场主要看钞能力,大机场比较有钱,买好的线路和加带宽,小机场很可能没钱运营下去。当然,大机场也会跑(其中出名的跑路大机场,比如当年高贵的rixcloud机场、便宜搞传销式的布丁机场,无限流量的喵帕斯机场、AAEX机场,还有在Youtube打广告的速蛙云,体验优秀的YoYu机场...),但是大机场跑路概率比小机场要小,一般大机场用户多,机场主不搞了还可以转卖让人接盘。
4.稳定与协议没有关系,对于用户来说协议不是最重要的,线路才是。SS、SSR、V2ray、Trojan都行,总体而言SS协议的延迟相对较低。被识别了目前只是封IP/端口,损失的是机场主,用户换一条线路即可。专线也需要看同时使用人数,几百人挤同一条小水管不如几个人的中转,甚至不如直连。评价机场好坏标准之一:维护是否快,出问题老板是否快速修复,机场主常年不在线,修复节点慢的也别买。
5.看入口,入口和用户本地网络之间的相性决定了用户使用机场的上限和下限。中转很重要,因为一旦中转挂了中转线路就没办法转发流量到落地机了。所以入口机器的数目很重要,最好买BGP多入口的,华为云BGP入口会好很多。而且现在GFW都喜欢搞中转机,包括反向墙和污染中转机的域名。
6.备用很重要!没有一直稳定的机场,就算是以稳出名的也有不稳的时候,因此如果你是重度翻墙用户当主用出问题时就需要备用,否则主用出问题就直接失联了。买2-3个稳定的比买一堆便宜的垃圾好,买多了放着浪费。备用不用相同入口,买了IEPL专线可以买普通中转或者直连机场备用(直连主要是晚高峰速度不行,且容易被封IP),也可以买按量付费的套餐/年付小流量套餐备用,不用不花钱。
7.游戏、语音、BT需要线路支持UDP。其实不太建议用机场线路打游戏,最好是使用UU加速器这种专业的,但是有些用户觉得专线机场延迟低也可以打,还可以少花一个买加速器的钱,具体自测。
8.机场主最好是在境外的,肉身在墙内的机场主自己都不确定自己能做多久。别买QQ机场,下面都是电报频道里的机场,相对透明,且竞争大,同样线路价格更低。可以翻翻Telegram群的历史消息,如果很糟糕肯定有很多其它用户吐槽的。对于测速图:需要看测试的运营商,带宽,测速的地点。测速图好看不代表好用,但是测速非常不好看基本不好用。测速图可以一时好看,但是需要保存长时好看才比较难。本博客机场都是长时间观察的,有历史过去几个月甚至一两年的测速结果,经历过一次次GFW的考验。
9\. 别一下买太长时间。被跑路了机场坑过的都懂。谁也不知道这机场能运行多久,啥时候跑路。如果出了永久套餐,说明机场主准备收割最后一波跑路了。别看单价流量多就觉得值,1块1T不好用也是浪费钱。
10.需要看奈飞的 ,目前封锁比较严重。基本一时能看一时不能,除非找老板定制个人线路。注意机场的倍率,2倍率就是用1M流量会算2M流量。机场基本都是有审计的,比如是BT下载、邮件端口和政治敏感网站(主要是轮系媒体)。
都是我踩过的坑总结而来的,不要再重蹈我的覆辙了。转载请注明本博客链接,抄袭我或者洗稿的要点脸,谢谢。
![](https://lh5.googleusercontent.com/6-z4InkXe-QUZz1AxEGacUuigPmQACb_9NgFHwoQkvM8IoBVzxWGFw10_gIJRNzG9rWVxigURlt6UbCeV6Gym5Zfd_Gd48arFU-PKF2lsgL-ttgjkIF5JCxGQSaQv7u1Dg=w1280)
华为云BGP入口IEPL专线机场,原GaCloud,香港老板,已有机场行业多年经验。自己开发的面板。自有机房。速度不错,且稳定性也很不错,适合求稳定的用户。也是本人主用之一。华为云广州入口,隧道至香港的CN2 出口。有按量付费可备用。有分组:B、C和H组,香港往其他地区路由:B组为运营商BGP路由 ;H组为AWS骨干网 ;C组为基于H组更高优先级。人数不一样,精品人少,碎片负载会更少。如果有新产品或者遇到波动,会优先给精品接入更贵的产品以及优化。稳定性不错。会员赠送一张7天奈飞会员体验卡。 官网(通过这个链接注册新用户全员无门槛8折优惠券,只能用一次。目前每充值一百可以抽奖,还有75折优惠) 
[WgetCloud官网1](https://bit.ly/3Ik4FJV)           [Wgetcloud官网2](https://invite.wgetcloud.ltd/auth/register?code=n7z3) 
- 开业时间:2021
- 老板肉身:香港
- 入口ip数量:华为云BGP入口,2 (深圳和上海)
- 过境:IEPL内网
- 落地ip数量: 59
- 协议:Shadowsocks+ShadowsocksR +Trojan+Vmess
- UDP 不支持
- 客户端数目:3
- 付款方式:支付宝、微信、USDT
- 专门客服:有
- 一键客户端
- 节点国家与地区:香港、日本、新加坡、美国、台湾、加拿大、俄罗斯、韩国、印尼、印度、土耳其、巴西、德国、泰国、澳洲、英国、荷兰、菲律宾、马来西亚
- [拓扑结构检测和流媒体、过往历史测速合集](https://jichangpingce.com/%E9%98%BF%E9%87%8C%E4%BA%91ss%E7%BA%BF%E8%B7%AF%E6%9C%BA%E5%9C%BA%E6%8E%A8%E8%8D%90GaCloud.html)
套餐:
      按量付费和自定义套餐选项:可当备用。1.2元/G 。自己自由搭配合适的套餐、流量、设备数目, 通用的机场面板无这功能。有按量付费,即使你不买这家的套餐,也应该买个按量付费当作备用,以防买的那家出问题失联。有些机场是需要代理才能打开的,失联或者忘记续费你就无办法续费了,死循环。
- 基础: 无国际专线,节点数:15 ;49/月 120G流量;180G147块/季度;240G/月,588/年;无SLA保证
- 优质: BGP线路,节点数:15 120G59块/月;180G177块/季度;240G/月,708/年
- 精品: BGP线路,双程CN2线路,节点数:29120G69块/月;180G/月,207块/季;240G/月,828/年
如图为精品套餐测速图晚高峰测速,南方电信1000M参考测速
![](https://lh4.googleusercontent.com/ii4GULOVlqGxvwPT6mJKJIqpK-9QSapcQ3eatfmdpZCEyb4sQHOSul0EIRRP9FA5ruyqbC229gPatbrG8xfoSpDUwQmo05pKG_N2cndg8LpU11eTdiDkACFcTMRwdrvRzw=w1280)
华为BGP入口IEPL专线SS协议机场,包括广港、沪日、京德,稳定性高延迟低,值得推荐!已经观察两年。
南部(港台新澳)走广州华为云入口,过境广港专线;东部节点(日韩美、南美)走上海华为云入口,过境沪日专线,北部节点( 欧洲)过境京德专线,京德比较少见,对北方用户友好,延迟明显会低很多。
特色:流媒体解锁和落地,有大量冷门节点,全球92+国家地区 220+条线路,各地家宽IP、原生ip。老板很认真挑选落地节点,基本都是原生(解锁各种流媒体)并且带宽大的才用,非常适合各类流媒体爱好者。老板人挺好,基本都在群里回答问题。机场主在香港。不买他家套餐,也推荐买140一年的流量包可做备用。家宽适合拿来注册账号之类的。
[官网链接1](https://bit.ly/3YghbhY)        [官网2(如果打不开请切换为全局代理)](https://suo.yt/IVgyODg)
- 开业时间:2018
- 老板肉身:香港
- 入口:华为云广州、上海、北京
- 过境:广港、沪日、京德内网专线(有京德对北方用户友好)
- 协议:Shadowsocks 
- [网络监控](http://system.tagvpn.xyz/)
- UDP: 大多数支持Full Cone
- 客户端数目:10
- 付款方式:支付宝、虚拟币
- [TG频道](https://t.me/tagnotif)
- 专门客服:有
- [流媒体解锁情况](https://node.tagvpn.xyz/)
- 落地:92+个国家,220+条线路,节点国家与地区非常多。家宽地区为:香港、澳门、台湾、新加坡、日本、马来西亚、越南、加拿大、美国
- [拓扑结构检测和流媒体、过往历史测速合集](https://jichangpingce.com/tag%E6%B5%8B%E9%80%9F%E6%95%B4%E5%90%88.html)   可查看过去两年的高清测速图
套餐:
- 个人Bronze | 250G/月 |160块/季 
- 个人Silver | 500G/月 |90块/月 
- 个人190Gold | 999G/月 |190块/月 
- 特选套餐 | 200G/年 |140块/年,不买月付套餐推荐买这个做备用,适合轻量用户,有效期一年
- 团队套餐 |3000G/月 |570块/每月
![](https://lh6.googleusercontent.com/OK7nqK8sb5sEk4q0l3FS-CkHKvWisM-AhpYxafVfkIAntZCKSCuv_hXaMDmEmk0U2YnR0obdD2MKg7dIhEAN8RDJO5ao4GzDqy7ss_PevB-1TX8LdI3Y2DQ4D9x7ACpbtg=w1280)
IEPL内网专线与公网中转ss机场,稳定性也不错。 [官网链接1](https://bit.ly/3Sfrkd7)              [官网链接2](https://suo.yt/tC69nKu) 
- 开业时间:2018
- 老板肉身:墙外
- 入口与过境线路:IEPL内网(深圳移动)+公网中转(湖南联通)
- 协议:Shadowsocks
- UDP:支持
- 付款方式:支付宝、微信
- TG频道:[雲翼公告板](https://t.me/joinchat/TCGYbvTuuOMjjTke)
- 一键客户端
- 地区:俄罗斯、印度、土耳其、巴基斯坦、巴西泰国、澳洲、菲律宾、阿根廷、韩国、香港、台湾、新加坡、日本、美国、英国
- [拓扑结构检测和流媒体、过往历史测速合集](https://jichangpingce.com/%E4%B8%93%E7%BA%BFss%E6%9C%BA%E5%9C%BA%E6%8E%A8%E8%8D%90%E4%B9%8B%E4%BA%91%E7%BF%BC%E7%BD%91%E7%BB%9C%E5%8E%86%E5%8F%B2%E6%B5%8B%E9%80%9F%E7%BB%93%E6%9E%9C.html)
套餐:
- 试用:1块1天5G
- 标准:22.8/月108G流量,4设备
- 高级:32.8/月198G流量,4设备
- 终极:89.8/月520G流量,10设备
- 全年648G188/年,3设备
- 全年1398G328/年,4设备
- 全年3288G688/年,6设备
![](https://lh6.googleusercontent.com/l4EB34b91mijJ61-laWQOg6a6PsCRglRbSM3VMq0U0iQGeoTVCk3TbiLYCpcp0XUPInpOiNOTaNZi2ferwJOx2vYCHtvBZp3150RyRXj6j6maoTTQHzkQHbHhT8uUyRo=w1280)
IEPL专线,SSR + V2RAY协议机场,有按量付费,老板在香港。推荐旗舰套餐起。高级节点可以用低级节点,需要去面板选择。
[STC官网1](https://bit.ly/3tJPGBS)           [STC官网2](https://suo.yt/msGOhsW)(如果打不开请切换为全局代理)
- 老板肉身:香港
- 开业时长:2020年前
- 过境:IEPL专线
- 协议:SSR + Vmess
- UDP:部分支持Full Cone
- 入口ip数量:10
- 付款方式:支付宝
- 一键使用客户端: 有
- 落地ip数量: 32+
- 节点国家与地区:香港、日本、新加坡、美国、台湾
- [拓扑结构检测和流媒体、过往历史测速合集](https://jichangpingce.com/stc%E5%8E%86%E5%8F%B2%E6%B5%8B%E9%80%9F%E7%BB%93%E6%9E%9C%E6%95%B4%E5%90%88.html) 
套餐:(按人民币算)
-  按量付费:0.8块/G。有效期一年。不用了可以退回余额。按量套餐适合做备用。只有基础和进阶线路。
- 基础套餐,中转线路,线路38条:
  100G/月,38块/月;200G/月,108块/季度;300G/月量,205/半年;500G/月,385块/年。2/3个在 线客户端。
- 进阶套餐,更多中转线路,线路38+13条:
        100G/月,48块/月;300G/月,136块/季度;400G/月,258/半年;600G/月:488块/年。3/4个在线客户端。
- 旗舰: 中转线路+专线线路,线路38+13+7条:推荐旗舰套餐起。
 100G/月,88块/月;400G/月,251块/季度;500G/月,475/半年;800G/月:898块/年。4/5个在 线客户端。
- 企业套餐:中转线路+更多专线线路,线路38+13+7+4条:
  100G/月,108块/月;500G/月,308块/季度;600G/月,583/半年;900G/月:1100块/年 。5/6 个在线客户端
默认订阅的是所在等级的线路,可以去官网“节点”改为自定义线路。移动测得比电信差,移动用户可能需要先试用看看。
![](https://lh6.googleusercontent.com/3Z8go8A991iCkc5dbuDDMDPsZ9nZeSZf__uSBm6ZH_vMxqihD-vVS6dNrz4ekOTPd1khOL5q0-zJrJmpQig_yuxVUSoP40gbATQ7SPr2_s-yWrae1jvqX1skZilYeE2S=w1280)
某老机场分站。ss协议,入口是深圳移动。延迟比较低,速度也不错。注册可免费试用。[老猫云官网1](http://bit.ly/3LoD6Rr)    [老猫云官网2](https://suo.yt/PrI9z90)
- 开业时间:主站是2017年开的,分站2年+
- 过境:IEPL专线
- 流媒体解锁:参考流媒体解锁图
- 入口:深圳移动
- UDP:支持
- 付款方式:支付宝
- 落地ip数量:51
- 协议:ss
- 专门客服:有
- 地区:香港、日本、新加坡、美国、台湾、英国、俄罗斯
- 落地:Nerocloud、FDCSERVERS、Hinet、DEDIPATH
- [节点监控页面](https://yun.xn--z7xt7y.com/)
- 试用:有
- [拓扑结构与流媒体历史测速结果合集](https://jichangpingce.com/%E8%80%81%E7%8C%AB%E4%BA%91%E5%8E%86%E5%8F%B2%E6%B5%8B%E9%80%9F%E7%BB%93%E6%9E%9C%E6%95%B4%E5%90%88.html)
套餐: 
- D套餐: 30/月, 每月200G
- E套餐: 40/月, 每月300G
- F套餐: 50/月, 每月500G
![](https://lh5.googleusercontent.com/pOgJ7z-sNvBrwJ4PEBdTrN0CNGWkVtGsG5k8FTepr-Xs7HDkw2uKE6HBl_z1JSClvFNyGTuk7MUg3ERhD0uGGXMZrh-J2itTuWRtqZYFyr58tojeeIDCeMImDhB7mjx5_Q=w1280)
IEPL内网专线SS+Vmess机场,老机场,CDN优选入口,智能接入。也有海外用户节点(就是给国外的人用的)。
套餐不限同时在线客户端数。注册需要先购买。[kycloud官网1](https://bit.ly/3JfUa9s)
[kycloud官网2](https://suo.yt/7DkNI5r)
- 开业时间:2017年
- 老板肉身:海外
- 入口 :CDN优选入口,智能接入。江苏电信和移动、河北电信、广东移动和电信
- 过境: IEPL内网专线
- 协议:Shadowsocks + Vmess
- 付款方式:支付宝、虚拟币USDT
- UDP:基本支持Full-Cone NAT
- TG频道和群组:在套餐内
- 客户端数目:不限制
- 流媒体解锁:TVB/Netflix/BBC/AbemaTV/DMM/hulu(us/jp)/Disney+ Paravi/rakutenTV(jp) 等
- 落地ip数量: 60+
- 节点国家与地区:香港、台湾、韩国、日本、新加坡、美国、英国、巴西、德国、阿根廷、土耳其、阿根廷、印度、马来西亚、泰国、菲律宾、俄罗斯
- [拓扑结构检测和流媒体、过往历史测速合集](https://jichangpingce.com/IEPL%E4%B8%93%E7%BA%BF%E6%9C%BA%E5%9C%BAkycloud%E5%8E%86%E5%8F%B2%E6%B5%8B%E9%80%9F%E7%BB%93%E6%9E%9C%E6%95%B4%E5%90%88.html)
套餐: 
- Mini: 每月10G,年付150,可以做备用,适合轻量用户
- Basic:每月50G,季付75
- Basic:每月50G,季付75
- Silver:每月100G,月付30
- Platinum:每月200G,月付40
- Ultimate 1 150/季度每月300G流量;年费498元
- Ultimate 2 210/季度每月500G流量;年费698元
- Team 1 369/季度每月1T流量
- Team 2 609/季度每月2T流量
![](https://lh4.googleusercontent.com/KPzNeO-qBpoVkKztuFc5PNh2tQJv3ESUw9-9GumlT0oOSHwq0sJnfE-8WH4TF_zxwK-ASaliIdRz1FoyOwJ45l6pSNMz5HjFOksLtVRliLUK3YzmYvSUVTkngAkEgUyTXQ=w1280)
全公网中转SS机场,比较低调。机场主在菲律宾。解锁也不错。
新用户首次95折优惠码:SPECIAL
[RelayCloud官网1](https://bit.ly/3TNkBaz)             [RelayCloud官网2](https://relaycloud.pro/auth/register?code=YqVfn)
- 开业时间:2020
- 老板肉身:菲律宾
- 入口ip数量:6,河南移动、江苏移动等
- 过境:公网中转
- 协议:Shadowsocks
- UDP: 支持
- 客户端数目:3+
- 付款方式:支付宝、微信
- TG频道:[RelayCloud Notice](https://t.me/joinchat/AAAAAFfR7-mbeYbPP8XH5w)     群组在套餐内
- 退款:有,3天无理由退款(仅虚拟货币)
- 落地:节点数量44个,美国、台湾、新加坡、日本、香港、英国、俄罗斯、菲律宾
- [拓扑结构检测和流媒体、过往历史测速合集](https://jichangpingce.com/relaycloud%E5%8E%86%E5%8F%B2%E6%B5%8B%E9%80%9F%E7%BB%93%E6%9E%9C%E6%95%B4%E5%90%88.html)
套餐:
- 月付80GB80G/月,19块/月,3个客户端
- 月付10GB 180G/月,26.8块/月,3
- 月付380GB 380G/月,56.8块/月,5
- 年付600GB 600G/年,148.8块/年,3
- 年付1200GB1200G/年,218.8块/月,3
- 年付2400GB2400G/年,398.8块/月,3
![](https://lh4.googleusercontent.com/AL0Z2ltD7sILUb4pbBNP4rmkQiEVOc4wgpZwQR4AQRz1d2mN8eA3dMiVS6sI0gB3NYLxQ24u73h7zCIz5z_ETDYY0JAsRZzEhj5yrXybYps_bktxZBrJch5gbaUSMebNGg=w1280)
vmess,深港内网专线机场。高性价比冷门节点机场。最便宜5块/25G流量起。
有两个特色:
1.主要是有多个回国节点:北京、上海 、河南郑州、山东青岛 、安徽合肥、广东深圳。白名单,常用国内流媒体使用。5、10倍率。需要购买英文名称套餐 才有:“This 200G Monthly Plan is for Foreign Customers Outside China”,放这家主要是因为有回国的机场很少。回国节点只能在境外使用,国内无法使用,且显示Ping Timeout超时是正常的,其实是能用的。
2.落地国家和节点多,130+国家,200+节点。且很多是低倍率。“权宜”套餐以上才有。
因为走南部的深港,所以到香港、澳门、新加坡、台湾等南部的地区速度才较好。加钱世界触手可及,等老板有钱再加沪日和沪美吧。
[EdNovas云官网链接1](https://suo.yt/h2luF8x)        [EdNovas云官网链接2](https://bit.ly/3DcTK0o)
- 开业时间:2020年12月
- 老板肉身:加拿大
- 过境:深港专线
- 回国线路:有,上白名单
- 协议:Vmess
- UDP : 支持
- 一键使用客户端:有, [安卓客户端下载地址](https://ednovas.dev/ednovas_cloud.apk)
- 在线设备数: 5
- 付款方式:支付宝、虚拟币
- TG频道: [EdNovas云](https://t.me/ednovasyun1)
- [服务器探针](https://tz.ednovas.me/)
- 节点数目:220+
- [审计规则,屏蔽的网站](https://github.com/EdNovas/rulelist/blob/main/rulelist)
- 退款:有
- 落地国家: 130+[目前机场节点覆盖图](https://lab.magiconch.com/world-ex/)
- [拓扑结构检测和流媒体、过往历史测速合集](https://jichangpingce.com/%E5%9B%9E%E5%9B%BD%E6%9C%BA%E5%9C%BAEDCloud%E5%8E%86%E5%8F%B2%E6%B5%8B%E9%80%9F%E7%BB%93%E6%9E%9C%E6%95%B4%E5%90%88.html)
![](https://lh5.googleusercontent.com/DwkeFhHljM61JAGONmN6xqtKmchk0HtdeURO3g2w9d8IVUhbZpG_pPf5da6AxQioSSqnQD27uU7xFoQl4NeO2wCF3Giyew94bdEL2AWLTIWEktQYQHcU6k03pX40AFrzIw=w1280)
![](https://lh5.googleusercontent.com/K9Q8V9z__oUKL_Dnu3D4n2zizwET7N3TjbyrSYdXd0jUco25T1IiH7H7MkGUBNYOEqsoxsqDNnT8ICkvf28zPdZf4AXz-599Qs8bbNih6GDkX_CmG7-cceorAr1cLFRySQ=w1280)
ss协议,入口是镇江移动,过境深港专线。比主站人少。速度不错。 之前更换了老板。 2022年更换过老板,新老板旗下不少机场。
[Catnet官网链接1](https://suo.yt/jdJQOsC)                                               [Catnet官网链接2,需要代理](https://bit.ly/3ubwf54) 
- 开业时间:2021年之前梦迪家分站
- 过境:深港专线
- 流媒体解锁:youtube Premium、HBO Max 、Abema TV 、 DAZN、PCR jP、
- 入口:镇江移动
- UDP:支持
- 付款方式:支付宝
- TG频道: [Catnet\_CN](https://t.me/catnet_official)
- 落地ip数量:48
- 协议:ss
- 专门客服:有
- 地区:香港、日本、新加坡、美国、台湾、德国、荷兰、印度、英国、加拿大、澳大利亚
- [拓扑结构检测和流媒体、过往历史测速合集](https://jichangpingce.com/catnet%E5%8E%86%E5%8F%B2%E6%B5%8B%E9%80%9F%E7%BB%93%E6%9E%9C%E6%95%B4%E5%90%88.html)
套餐:
-  Small:25/月, 半年付120,每月80G,可3个在线设备,限速250Mbps
-  Meduim50/月,半年付135, 每月300G;可3个在线设备,限速750Mbps
![](https://lh4.googleusercontent.com/BVuZTRApdc1fGiL87Fns2GctsXPAIiTbG__DZfK-Cl4ehn4wBdbWRhv1rqYO0Uk8Pw_MLP7vVuONxjuj6ucj0bqopXZ3dX51ZKdAxzd4_YEpNWjG9JIspVaNEDgO-Z4hkw=w1280)
3年老机场了。Vmess+Trojan中转线路机场。线路是G口湖南联通和广州移动。机场主在东南亚。注册可以试用。[大哥云官网链接1](https://bit.ly/3Lk1Mu9)      
[大哥云官网链接2](https://suo.yt/bXSbOkn) 
- 开业时间:2020
- 老板肉身:东南亚
- 过境:公网中转
- 协议:Vmess+Trojan
- UDP:支持
- 付款方式:支付宝、微信
- 一键使用客户端: 有
- 节点数目:46
- 落地:日本、香港、韩国、新加坡、菲律宾、泰国、菲律宾、越南、美国、台湾、英国、印度
- 试用:有, 一天10G
- 拓扑结构检测和流媒体、历史测速结果合集
套餐: 
- 单月套餐A19.8/月100G
- 单月套餐B29.8/月150G
- vip1小流量年付15GB: 88/年,15G/月
-  季付套餐A 200GB: 69/季,200G/月
-  季付套餐B 300GB: 129/季,300G/月
-  年付套餐A 300GB: 199/年,300G/月
- 年付套餐B 500GB: 299/年,500G/月
![](https://lh3.googleusercontent.com/fA2ej0gpaIJBClcJ7HLI8lELDsJlUfGTLN8bqWo_gIZkfsjZDCkD9A3ctVguqs8wqdIL_PhSC7PIBzVRuLDc42lIBOVeJa8HZAKdMlQa2hDT2Wwsd3pgbRETS2ICSjph-w=w1280)
ss协议公网+IEPL专线机场。稳定性不错。比较低调。后端有负载均衡,均衡负载策略会先通过'国内服务器'转发到'多台境外隧道服务器',再转发到'实际落地服务器。  [少数派官网](http://bit.ly/3ZjtNGd)1     [少数派官网链接2](https://sspcloud.net/#/register?code=hK1bzVm2) 
记得提前续费或者买个按量备用,避免过期了登录不上续费。
- 开业时间:2019
- 老板肉身:墙外
- 过境:公网中转+IEPL内网专线
- TG频道: [少数派的广而告之](https://t.me/joinchat/Rw92xD_F57WssTZj) 
- 协议:Shadowsocks
- UDP:支持
- 付款方式:支付宝、微信、虚拟币
- 一键使用客户端: 有
- 节点数目:50+
- 落地:美国、台湾、新加坡、日本、香港、德国、英国、俄罗斯、菲律宾
- [拓扑结构检测和流媒体、过往历史测速合集](https://jichangpingce.com/%E5%B0%91%E6%95%B0%E6%B4%BE%E5%8E%86%E5%8F%B2%E6%B5%8B%E9%80%9F%E7%BB%93%E6%9E%9C%E6%95%B4%E5%90%88.html) 
套餐:
- 每月29块200G流量 3个客户端
- 每月45块300G流量 3个客户端
- 每月89块600G流量 10个客户端 
![](https://lh3.googleusercontent.com/ltSHjTEetJUVHAIeeMmIy0ezXX8_IBvzwT4vYke7cczJfpKQ-jXS1Vnu0DL4oz8tQ0RsMrGINCIpTxvnMLJ9qChlKdGtK3jngRMFY8V2nMT1EybljNSUOzAgxEVrvsozPg=w1280)
搬瓦工官方的SSR +Vmess机场,加拿大注册公司,正规大公司:线路是IPLC/GIA+CN2。
相比私人的机场,好处就是安全,无审计,基本不会跑路,信息泄露概率小。IP 被墙自动切换。
如果是对安全性的重视程度较大的和担心私人机场跑路的用户,有敏感操作的,推荐这家机场。同时,不满意一般可以退款!
支持paypal和支付宝支付,5.2%折扣循环优惠码:JMS9272283 
[官网注册地址,需要代理或全局模式访问](https://bit.ly/3weANGp)
- 开业时间:2018
- 老板:加拿大大公司
- 专线: 有
- 协议:SSR + Vmess
- 专门客服:有
- 退款:有
- 落地:香港、日本、美国
- 付款方式:支付宝、银联、Paypal
套餐:
1)Just My Socks IPLC HK 100 \*\* EARLY ACCESS:深圳-香港 IPLC 跨境专线。
v2ray协议,IPLC香港线路。3条线路:
  100G/每月21刀,限速100Mbps3个设备。
   300G/每月49刀,限速100Mbps3个设备。
新出的套餐,搬瓦工还是懂得大家需要什么。对电信联调和移动三网有优化,延迟低。我之前实测是不限速的。适合游戏爱好者。
ct:适合中国电信;cu:适合中国联通,cm:适合中国移动网络。
不一定有货,挺抢手的,用了一个月,挺稳的,但是就是比一般机场贵。
2)Just My Socks Hong Kong  香港节点:
100流量,34.99美元/月,3个设备。限速100Mbps
500G流量,149.99美元/月,5个设备.限速500Mbps
1000G流量,279.99美元/月,无限个设备.限速1000Mbps
三网直连,电信双向CN2 GIA,移动和联通直连,跟搬瓦工香港机房的线路一样是香港机房的最优线路。速度快、延迟低、线路稳
3)Just My Socks Tokyo 日本节点:
100G流量,29.99美元/月,3个设备。限速100Mbps
500G流量,135.99美元/月,5个设备.限速200Mbps。
日本东京节点,三网 CN2 GIA 线路。适合电信和联调带宽。移动的没优势。比Just My Socks LA好一点。
4)Just My Socks HK CMI+NTT Plan 500
8.99刀/月,500GB/月,不限速,5个设备。
HK CMI是中国移动香港数据中心,走NTT香港中转。中国电信使用CN2 GIA线路,联通电信直连。
新套餐:电信,早晚速度可以,其他时段速度比较感人(1080P),延迟稳定在80-95ms。非电信网络,速度稳定,延迟在40-60ms左右,500MB宽带以下能跑满,上传速度20Mbps左右。使用移动和联通网络的可以试试,电信不建议。
5)Just My Socks London 5006.8刀/月,500GB/月,不限速, 5个设备。ss+v2ray。
6)Just My Socks LA,洛杉矶节点,(直连线路,因为最便宜,很多人买这个,不推荐,慢,超售):
500G流量,5.88美元/月,5个设备。限速2.5 Gbps 
1T流量,9.88美元/月,不限设备数。限速5 Gbps
5T流量,48.99美元/月,不限设备数。限速5 Gbps
美国洛杉矶 CN2 GT/CN2 GIA
肯定还是有人想自建,最好购买它家CN2 GIA线路:
搬瓦工CN2-GIA是目前最稳定的线路之一,三网表现都不错。绝版瓦工套餐价格居高不下,已经成为传家宝,理财产品。
虽然市面上有很多vps厂商声称有GIA线路,但是搬瓦工比他们中的绝大多数都要好不少。[搬瓦工官网](https://bit.ly/3sDxUwC)
全IEPL专线传输,支持 SS+SSR++V2ray+Trojan协议机场。推荐给轻量用户。Trojan节点数目比SSR少。
不限时ip 和设备数目。[官网地址](https://bit.ly/3G9K4Dy) 
- 开业时间:2021
- 老板肉身:北美
- 过境:IEPL内网专线
- 入口数目:2,广州移动
- UDP:支持
- 协议:Shadowsocks+ShadowsocksR +Trojan+Vmess
- 设备数目:无限制
- 付款方式:支付宝
- TG频道:[Hutao公告](https://t.me/joinchat/IsZvZdFDboAzZmEx)
- 客服:有
- 落地数目: 28
- 落地:美国、台湾、新加坡、日本、香港
- [拓扑结构检测和流媒体、过往历史测速合集](https://jichangpingce.com/IEPL%E4%B8%8E%E9%9A%A7%E9%81%93ssr%E6%9C%BA%E5%9C%BA%E6%8E%A8%E8%8D%90-hutao.html) 
套餐:
- mini12块/月50G起,限速200M
- Pro23块/月150G起,不限速
- Business34块/月300G起,不限速
- Enterprise109块/月1500G起,不限速
![](https://lh5.googleusercontent.com/nB3YPY8Qr49vZRVssnoVc53LsJ7r0n07cOrQhQocYz0tbcvK2XAd8qYgsETM_EGtPX6Kxo4pWjck61MqwUKd6SOJFN5hFI-gzQYl4LIpKN2ZiEzVNyEt5U9X2YSkh5Hlmw=w1280)
全IEPL内网专线ss机场,人目前比较少,适合想要人少机场的用户。 [Fenda官网1](https://suo.yt/c0CZffc)         [Fenda官网2](https://bit.ly/3tOgI9J)
- 开业时间:2021
- 老板肉身:北美
- 过境:IEPL内网专线
- 入口ip数量:2
- 协议:Shadowsocks
- UDP:支持
- 付款方式:支付宝、银联
- 一键使用客户端: 有
- 落地:美国、台湾、新加坡、日本、香港、韩国
- [拓扑结构检测和流媒体、过往历史测速合集](https://jichangpingce.com/ss%E4%B8%AD%E8%BD%AC%E6%9C%BA%E5%9C%BA%E6%8E%A8%E8%8D%90-fenda.html) 
套餐:
- 基础月付:12.8块/月88G起;3个设备起
- 进阶月付:22.8块/月188G起;4个设备起
- 旗舰月付:32.8块/月288G起;6个设备起
![](https://lh6.googleusercontent.com/7xB10peABjg9BpThBRzf2UTdEp8-E2IH7hI4s0aAJdcvN9qAENb8TJmAokM8_WwHaYUNdjUCklGZAvryHwcfpVQWO6Ff7mkONPtuxzmqU4_73lxJ0-MsDS73ZoovpD-Ujw=w1280)
SSR(主要是SSR+Trojan,全IEPl专线机场。有各个平台小白一键使用客户端。主要是便宜。
[官网地址1](https://bit.ly/3d3Yqga)         [官网2(如果打不开请切换为全局代理)](https://suo.yt/jo4NFtf)
- 开业时间:2019
- 老板肉身:北美
- 入口ip  广州、海南
- 协议:ShadowsocksR +Trojan
- UDP:支持
- 付款方式:支付宝、银联
- 专门客服:有
- 小白客户端:Windows+Mac+安卓
- 落地:美国、台湾、新加坡、日本、香港
- 节点数目:40+
- [拓扑结构检测和流媒体、过往历史测速合集](https://jichangpingce.com/yiyo%E5%8E%86%E5%8F%B2%E6%B5%8B%E9%80%9F%E7%BB%93%E6%9E%9C%E6%95%B4%E5%90%88.html)
套餐:
- 每月10块50G流量 2个客户端,随便用用没问题。
- 每月18块150G流量 3个客户端
- 每月28块300G流量 5个客户端
- 每月38块500G流量 6个客户端
- 每月78块1000G流量 18个客户端
- 每月98块2000G流量 18个客户端
![](https://lh6.googleusercontent.com/KNLj5oflHmEbxC1hbAW3VAGh1erh0_04vnJjr3_0T7naxnNV_yAyW5ac6-fyPp1ILiFsX_n2SM4N-veDBGHWxBjkjB_Q55Um5joEjG5g-AesIXfOtGx-YKSdUwPU_jN-1g=w1280)
以上就是我收集的一些值得推荐的机场了,基本包括了ss、ssr、v2ray、trojan协议,基本全是中转,没有全直连线路机场,老板全在境外(肉身在国内的机场主不干了只是早晚的事,人少直接跑,人多的他会选择把机场卖了),同时开业时间较长,即使出问题老板修复速度也快,跑路概率较小。同时本一直更新测速持续观察,哪家机场表现长时间变差了就会从本文剔除掉,不再推荐。机场几百上千家,我也没要推荐差的机场。从而让新接触机场的新人少花冤枉钱少躺坑,且有良好的翻墙体验。
最新新闻欢迎关注频道:[科学上网与机场观察](https://t.me/jichangtj)
其它碎碎念:
1\. 近期临近国庆和二十大,近期很多机场上游的国内入口机器被查,很多机场不稳。记得搞个备用机场。--20220929。两会期间可能有机场会停止注册,正常现象。(202303)
2.平时养成更新订阅的好习惯,因为机场节点很多容易更换,更新订阅才能更新新的节点,一般Clash for Windows和QuantumultX都是默认会自动更新的。如果节点出问题了:先检查流量是否用完,是否过期了。正常则再更新节点订阅,不会更新就重新复杂粘贴到代理软件里面。还是有问题,群里或者工单问:说明清楚是哪个节点,你的运营商是哪个,哪个地区。如果是问群友,最好礼貌一点,毕竟群友是义务免费回答别人问题,回答与否看心情的。--202210
3.注册时收不到验证码,可以去邮箱垃圾箱里面找找。
4 各平台客户端推荐:
Windows推荐使用Clash for window / Clash-verge / Netch
Mac推荐使用Clash for windows和Clash-verge的Mac版本/ ClashX / 有钱的买Surge
IOS推荐小火箭Shadowsocket / QuantumultX / 有钱的买Surge
安卓推荐Surfboard、Matsuri、ClashforAndroid(CFA)、V2rayNG
Linux 推荐Clash for windows或Shell clash
路由器可以使用OpenClash。具体参考:[各平台代理客户端推荐与教程](https://sites.google.com/view/honven/%E9%A6%96%E9%A1%B5/%E5%90%84%E5%B9%B3%E5%8F%B0%E4%BB%A3%E7%90%86%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%8E%A8%E8%8D%90%E4%B8%8E%E6%95%99%E7%A8%8B?authuser=1)
5.机场套路:
新开的贼便宜机场套路:为了吸引客户一开始价格非常便宜,打价格战,很容易吸引大量用户,但是久了人数多了机场主必须要加线路或者提高带宽扩容来保证体验,否则速度必然降低并且不稳定。而扩容又必须要花钱,所以不跑路就会涨价,就是低价吸引一波来割韭菜。
便宜机场套路2:突然搞活动优惠力度过大,吸引用户。 AFF比例非常高,吸引推广。然后便宜短时间大批人购买涌入很容易拉跨,黑心的直接跑路,典型的小机场捞钱手法。
便宜机场套路3:线路多,但是复用,就是虽然显示多条线路但入口和落地其实是同一条线路,见过10条线路其实都是一条!不少机场这样搞,看上去线路多,骗子。一挂挂一片。就算没挂,当你觉得某条线路不快,切换线路,切了10条都是同一条。
便宜机场套路4:月抛机场,卖得也及其便宜。买的都是很便宜的月抛线路,甚至直连不用中转机,省了中转机的钱,所以很便宜。但是线路变化频繁,随时跑路:如果比较多azure/aga/nhn/hinet这些月抛机器,在azure/nhn/hinet等月抛机器风控越来越严重的一个情况下,如果他开不出了新月抛机器,那么他们会承受不了正价机器,因为正价机器的流量根本不够他给用户用的。下面推荐的机场基本没有月抛。这些便宜机场如果要买只建议月付!不管年付多优惠,千万别年付!
@@ -0,0 +1,209 @@
---
page-title: "podman/rootless_tutorial.md at main · containers/podman"
url: https://github.com/containers/podman/blob/main/docs/tutorials/rootless_tutorial.md
date: "2023-03-31 11:46:31"
---
[![PODMAN logo](https://raw.githubusercontent.com/containers/common/main/logos/podman-logo-full-vert.png)](https://raw.githubusercontent.com/containers/common/main/logos/podman-logo-full-vert.png)
## Basic Setup and Use of Podman in a Rootless environment.
Prior to allowing users without root privileges to run Podman, the administrator must install or build Podman and complete the following configurations.
## cgroup V2 support
The cgroup V2 Linux kernel feature allows the user to limit the amount of resources a rootless container can use. If the Linux distribution that you are running Podman on is enabled with cgroup V2 then you might need to change the default OCI Runtime. Some older versions of `runc` do not work with cgroup V2, you might have to switch to the alternative OCI runtime `crun`.
The alternative OCI runtime support for cgroup V2 can also be turned on at the command line by using the `--runtime` option:
or for all commands by changing the value for the "Default OCI runtime" in the `containers.conf` file either at the system level or at the [user level](https://github.com/containers/podman/blob/main/docs/tutorials/rootless_tutorial.md#user-configuration-files) from `runtime = "runc"` to `runtime = "crun"`.
## Administrator Actions
### Installing Podman
For installing Podman, please see the [installation instructions](https://podman.io/getting-started/installation).
### Building Podman
For building Podman, please see the [build instructions](https://podman.io/getting-started/installation#building-from-scratch).
### Install `slirp4netns`
The [slirp4netns](https://github.com/rootless-containers/slirp4netns) package provides user-mode networking for unprivileged network namespaces and must be installed on the machine in order for Podman to run in a rootless environment. The package is available on most Linux distributions via their package distribution software such as `yum`, `dnf`, `apt`, `zypper`, etc. If the package is not available, you can build and install `slirp4netns` from [GitHub](https://github.com/rootless-containers/slirp4netns).
### Ensure `fuse-overlayfs` is installed
When using Podman in a rootless environment, it is recommended to use `fuse-overlayfs` rather than the VFS file system. For that you need the `fuse-overlayfs` executable available in `$PATH`.
Your distribution might already provide it in the `fuse-overlayfs` package, but be aware that you need at least version **0.7.6**. This especially needs to be checked on Ubuntu distributions as `fuse-overlayfs` is not generally installed by default and the 0.7.6 version is not available natively on Ubuntu releases prior to **20.04**.
The `fuse-overlayfs` project is available from [GitHub](https://github.com/containers/fuse-overlayfs), and provides instructions for easily building a static `fuse-overlayfs` executable.
If Podman is used before `fuse-overlayfs` is installed, it may be necessary to adjust the `storage.conf` file (see "User Configuration Files" below) to change the `driver` option under `[storage]` to `"overlay"` and point the `mount_program` option in `[storage.options.overlay]` to the path of the `fuse-overlayfs` executable:
```
[storage]
driver = "overlay"
(...)
[storage.options.overlay]
(...)
mount_program = "/usr/bin/fuse-overlayfs"
```
### Enable user namespaces (on RHEL7 machines)
The number of user namespaces that are allowed on the system is specified in the file `/proc/sys/user/max_user_namespaces`. On most Linux platforms this is preset by default and no adjustment is necessary. However, on RHEL7 machines, a user with root privileges may need to set that to a reasonable value by using this command: `sysctl user.max_user_namespaces=15000`.
### `/etc/subuid` and `/etc/subgid` configuration
Rootless Podman requires the user running it to have a range of UIDs listed in the files `/etc/subuid` and `/etc/subgid`. The `shadow-utils` or `newuid` package provides these files on different distributions and they must be installed on the system. Root privileges are required to add or update entries within these files. The following is a summary from the [How does rootless Podman work?](https://opensource.com/article/19/2/how-does-rootless-podman-work) article by Dan Walsh on [opensource.com](https://opensource.com/)
For each user that will be allowed to create containers, update `/etc/subuid` and `/etc/subgid` for the user with fields that look like the following. Note that the values for each user must be unique. If there is overlap, there is a potential for a user to use another user's namespace and they could corrupt it.
```
cat /etc/subuid
johndoe:100000:65536
test:165536:65536
```
The format of this file is `USERNAME:UID:RANGE`
- username as listed in `/etc/passwd` or in the output of [`getpwent`](https://man7.org/linux/man-pages/man3/getpwent.3.html).
- The initial UID allocated for the user.
- The size of the range of UIDs allocated for the user.
This means the user `johndoe` is allocated UIDs 100000-165535 as well as their standard UID in the `/etc/passwd` file. NOTE: this is not currently supported with network installs; these files must be available locally to the host machine. It is not possible to configure this with LDAP or Active Directory.
If you update either `/etc/subuid` or `/etc/subgid`, you need to stop all the running containers owned by the user and kill the pause process that is running on the system for that user. This can be done automatically by using the [`podman system migrate`](https://github.com/containers/podman/blob/main/docs/source/markdown/podman-system-migrate.1.md) command which will stop all the containers for the user and will kill the pause process.
Rather than updating the files directly, the `usermod` program can be used to assign UIDs and GIDs to a user.
```
usermod --add-subuids 100000-165535 --add-subgids 100000-165535 johndoe
grep johndoe /etc/subuid /etc/subgid
/etc/subuid:johndoe:100000:65536
/etc/subgid:johndoe:100000:65536
```
### Enable unprivileged `ping`
Users running in a non-privileged container may not be able to use the `ping` utility from that container.
If this is required, the administrator must verify that the UID of the user is part of the range in the `/proc/sys/net/ipv4/ping_group_range` file.
To change its value the administrator can use a call similar to: `sysctl -w "net.ipv4.ping_group_range=0 2000000"`.
To make the change persist, the administrator will need to add a file with the `.conf` file extension in `/etc/sysctl.d` that contains `net.ipv4.ping_group_range=0 $MAX_GID`, where `$MAX_GID` is the highest assignable GID of the user running the container.
## User Actions
The majority of the work necessary to run Podman in a rootless environment is on the shoulders of the machines administrator.
Once the Administrator has completed the setup on the machine and then the configurations for the user in `/etc/subuid` and `/etc/subgid`, the user can just start using any Podman command that they wish.
### User Configuration Files
The Podman configuration files for root reside in `/usr/share/containers` with overrides in `/etc/containers`. In the rootless environment they reside in `${XDG_CONFIG_HOME}/containers` (usually `~/.config/containers`) and are owned by each individual user.
The three main configuration files are [containers.conf](https://github.com/containers/common/blob/main/docs/containers.conf.5.md), [storage.conf](https://github.com/containers/storage/blob/main/docs/containers-storage.conf.5.md) and [registries.conf](https://github.com/containers/image/blob/main/docs/containers-registries.conf.5.md). The user can modify these files as they wish.
#### containers.conf
Podman reads
1. `/usr/share/containers/containers.conf`
2. `/etc/containers/containers.conf`
3. `$HOME/.config/containers/containers.conf`
if they exist in that order. Each file can override the previous for particular fields.
#### storage.conf
For `storage.conf` the order is
1. `/etc/containers/storage.conf`
2. `$HOME/.config/containers/storage.conf`
In rootless Podman certain fields in `/etc/containers/storage.conf` are ignored. These fields are:
```
graphroot=""
container storage graph dir (default: "/var/lib/containers/storage")
Default directory to store all writable content created by container storage programs.
runroot=""
container storage run dir (default: "/run/containers/storage")
Default directory to store all temporary writable content created by container storage programs.
```
In rootless Podman these fields default to
```
graphroot="$HOME/.local/share/containers/storage"
runroot="$XDG_RUNTIME_DIR/containers"
```
[$XDG\_RUNTIME\_DIR](https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html#variables) defaults on most systems to `/run/user/$UID`.
#### registries
Registry configuration is read in by this order
1. `/etc/containers/registries.conf`
2. `/etc/containers/registries.d/*`
3. `HOME/.config/containers/registries.conf`
The files in the home directory should be used to configure rootless Podman for personal needs. These files are not created by default. Users can copy the files from `/usr/share/containers` or `/etc/containers` and modify them.
#### Authorization files
The default authorization file used by the `podman login` and `podman logout` commands reside in `${XDG_RUNTIME_DIR}/containers/auth.json`.
### Using volumes
Rootless Podman is not, and will never be, root; it's not a `setuid` binary, and gains no privileges when it runs. Instead, Podman makes use of a user namespace to shift the UIDs and GIDs of a block of users it is given access to on the host (via the `newuidmap` and `newgidmap` executables) and your own user within the containers that Podman creates.
If your container runs with the root user, then `root` in the container is actually your user on the host. UID/GID 1 is the first UID/GID specified in your user's mapping in `/etc/subuid` and `/etc/subgid`, etc. If you mount a directory from the host into a container as a rootless user, and create a file in that directory as root in the container, you'll see it's actually owned by your user on the host.
So, for example,
```
> whoami
john
# a folder which is empty
host> ls /home/john/folder
host> podman run -v /home/john/folder:/container/volume mycontainer /bin/bash
# Now I'm in the container
root@container> whoami
root
root@container> touch /container/volume/test
root@container> ls -l /container/volume
total 0
-rw-r--r-- 1 root root 0 May 20 21:47 test
root@container> exit
# I check again
host> ls -l /home/john/folder
total 0
-rw-r--r-- 1 john john 0 May 20 21:47 test
```
We do recognize that this doesn't really match how many people intend to use rootless Podman - they want their UID inside and outside the container to match. Thus, we provide the `--userns=keep-id` flag, which ensures that your user is mapped to its own UID and GID inside the container.
It is also helpful to distinguish between running Podman as a rootless user, and a container which is built to run rootless. If the container you're trying to run has a `USER` which is not root, then when mounting volumes you **must** use `--userns=keep-id`. This is because the container user would not be able to become `root` and access the mounted volumes.
Another consideration in regards to volumes:
- When providing the path of a directory you'd like to bind-mount, the path needs to be provided as an absolute path or a relative path that starts with `.` (a dot), otherwise the string will be interpreted as the name of a named volume.
## More information
If you are still experiencing problems running Podman in a rootless environment, please refer to the [Shortcomings of Rootless Podman](https://github.com/containers/podman/blob/main/rootless.md) page which lists known issues and solutions to known issues in this environment.
For more information on Podman and its subcommands, follow the links on the main [README.md](https://github.com/containers/podman/blob/main/README.md#podman-information-for-developers) page or the [podman.io](https://podman.io/) web site.
@@ -0,0 +1,133 @@
---
page-title: "《软件供应商手册:SBOM的生成和提供》解读 - FreeBuf网络安全行业门户"
url: https://m.freebuf.com/articles/neopoints/331333.html
date: "2023-03-07 09:30:14"
---
## 专栏·供应链安全
数字化时代,软件无处不在。软件如同社会中的“虚拟人”,已经成为支撑社会正常运转的最基本元素之一,软件的安全性问题也正在成为当今社会的根本性、基础性问题。
随着软件产业的快速发展,软件供应链也越发复杂多元,复杂的软件供应链会引入一系列的安全问题,导致信息系统的整体安全防护难度越来越大。近年来,针对软件供应链的安全攻击事件一直呈快速增长态势,造成的危害也越来越严重。
为此,我们推出“供应链安全”栏目。本栏目汇聚供应链安全资讯,分析供应链安全风险,提供缓解建议,为供应链安全保驾护航。
注:以往发布的部分供应链安全相关内容,请见文末“推荐阅读”部分。
## **摘要**
本手册由美国国家电信和信息管理局(NTIA)格式化与工具工作组于2021年11月27日发布,旨在为软件供应商提供软件物料清单(SBOM)生成和交付方面的指导。手册以SBOM生成的四步骤流程为主线,重点说明了在软件构建(Build)前、构建中和构建后等各阶段构造SBOM时的特点或应注意事项,以及目前常用的SBOM验证方法。整体流程的完整性和对各阶段应重点关注问题的讨论是本手册的主要亮点。手册可为我国软件生产企业或个人在SBOM生成和构造等方面提供一定的指导和借鉴。
## **背景解读**
近年来,全球软件供应链安全攻击事件持续高发,且危害越来越大,特别是2020年底爆发的太阳风(SolarWinds)攻击事件,使得美国更加重视自身的供应链安全防护。2021年5月12日,美总统拜登签署了“关于改善国家网络安全(EO 14028)”的行政命令,其中的第4节针对“加强软件供应链安全”提出了一系列具体要求,旨在迅速改善美国软件供应链的安全性和完整性,而其第(f)条要求,NTIA于同年7月11日前发布SBOM的最低要求。
对此,NTIA于2021年7月12日发布了《SBOM最小要素》,规定了最小要素应包括数据字段、自动化支持、实践和过程等三个方面,其中的实践和过程指为了将SBOM集成到安全开发生命周期操作中而需定义其请求的操作、生成和使用等内容,包含频率、深度、已知的未知情况(known unknowns)、分发和交付、访问控制和容错等。可以看出,SBOM的生成是将其集成到安全开发生命周期的重要一环。
11月27日发布的《软件供应商手册:SBOM生成和提供》是对最小要素中SBOM生成的进一步细致讨论和在实施层面的补充,给出了SBOM生成的一般性流程及每一步中应关注的重点。手册中关于SBOM三种数据格式(SPDX、CycloneDX、SWID)和特定名词(如“已知的未知情况”)的规定均与最小要素一脉相承。另外,根据手册中的说明,这里的软件供应商指的是商用软件、开源软件、外包软件等广义的供应商。
## **正文解读**
通过对手册内容进行分析,作者归纳出其参考价值和指导作用主要体现在4个方面。
### **01** **以有效性为最终目标,总结了SBOM生成的工作流程**
尽管各类组织用来生成SBOM的工具和过程多种多样,但手册归纳出了这一过程的一般性工作流程模型,即通过“识别组件-获取数据-构造SBOM-验证SBOM”4个步骤,最终得到格式有效、属性合规的SBOM文件。
在上述过程中,每个步骤均有相应的技术、自动化工具、标准等进行辅助和支持,手册介绍了它们中的代表性内容,例如软件组成分析(SCA)工具、代码分析工具、SBOM格式验证工具、软件包数据交换(SPDX)标准、OWASP CycloneDX和软件组件验证(SCVS)标准等。
总体而言,本手册对于SBOM的构造和生成具有一定的指导作用,可基于其描述的流程、标准和工具等开展相关的研究工作,以增强软件产品透明度,便于进行安全分析和保障。
### **02** **以构建为阶段划分点,讨论了SBOM构造的主要方法**
手册描述了在软件构建(Build)之前、构建时和构建以后的不同时间阶段,构造SBOM时可使用的方法工具、应考虑的信息类型、相应的特点和注意事项等内容,如表1所示。
表1 不同阶段SBOM生成的对比
**生成阶段**
**生成方法**
**特点/注意事项**
构建前
作为版本控制系统一部分,或由挖掘产品构建管道输入的工具创建源码级SBOM
有助于关键组件的识别及在创建产品之前查找漏洞;便于构建到源文件的追溯;可能会呈现并不包含在最终可执行文件中的脆弱源码
构建时
作为构建工件自动化生成SBOM
包含更权威的组件特征、无人工输入错误、自动化SBOM签名;必须确定构建过程中生成的SBOM的格式(列举了SPDX等3种)
在构建管道或软件工厂中生成SBOM
构建管道方法容易使用,但可能需要额外的资源集成管道;软件工厂方法可解决多个开发生态系统没有一致SBOM支持的问题
从容器化过程中导出容器镜像SBOM
应汇总并识别来自所有层的所有软件的信息;应包括容器间依赖关系、构建时间、签名等
构建以后
(SBOM应包括生成时间、SBOM版本、签名等)
旧系统中使用功能;来自不同的供应商、过程和工具等的SBOM信息的生成
应补充接近工程过程的组件数据、已知的未知情况等;代码分析工具可扫描上游供应商组件的SBOM,但识别商业组件方面能力不足
非自动化系统和过程的SBOM生成
应理解SBOM中列出的组件的来源和软件标识,以及如何获取这些信息
手册对每个阶段中SBOM生成的特点或应注意方面进行了一些点上的描述,包括举例等方式,多以说明性为主,缺少统一的描述逻辑。尽管如此,通过对表中内容的分析依然可以发现:
- **收集信息的全面性是SBOM构造的基础。**识别和收集软件组件信息的全面性是首先要考虑的。手册明确了,在构建过程中生成SBOM的,需提前确定格式,即使用标准来规范待收集的内容,并且在构建后还要补充必要的信息(例如无法通过自动化手段得到的)。
- **三个阶段的SBOM生成工作各有侧重。**构建时的自动化信息收集是SBOM生成的主要方式;源码级SBOM可以作为辅助;构建之后阶段对SBOM的构造以信息(特别是来源信息)的补充和集成(多供应商SBOM)为主。
- **自动化工具提高了SBOM构造的效率和可操作性。**手册提到的工具包括:构建前使用的版本控制系统,挖掘构建管道输入的工具;构建时使用的Git,与构建系统、包管理器和持续集成(CI)服务器集成的工具,构建管道和软件工厂;构建后使用的代码分析工具等
### **03**  **以安全性为出发点,分析了SBOM应包含的内外依赖**
为了使运行时依赖关系等引入漏洞的情况不成为消费者和供应商的盲点,手册强调SBOM应避免缺失对应用程序所安装的运行时依赖项、操作系统、动态链接库(DLL)、升级程序、共享库或其他包含项的描述,且描述时应避免存在歧义;另外,为了提高供应商解决相关安全问题的效率,手册明确当软件功能执行依赖于对外部服务调用时,可使用SBOM列出软件交付所需的外部服务。
内外部依赖关系是应用程序引入安全问题的重要来源之一,手册将应用的内部依赖项和外部依赖的服务作为SBOM的重要组成部分,能够帮助消费者和供应商更全面的了解应用程序,进而掌握可能引入安全问题的途径,及时采取相应缓解措施,这有利于提高软件安全防护的效率和准确性。
### **04**  **以可操作性为目的,列举了SBOM验证的工具和标准**
针对SPDX、CycloneDX和SWID三种SBOM的格式正确性和完整性的检验,手册列出了相应自动化工具的链接;针对SBOM信息中声明的相关组件的识别、验证和评估等,手册提到了标准OWASP SCVS、OpenChain和软件组成分析(SCA)工具。
目前SCA工具在识别软件组成、分析软件成分、统计软件资产等方面功能明显,可有效辅助SBOM中声明组件和依赖信息的验证。但SBOM文件自身验证的工具还比较初级,并且都与特定的SBOM格式相绑定。例如手册中提到的SBOM格式验证工具,仅能够对格式的正确性和完整性进行检查,而不能检查填充SBOM字段的数据质量或准确性。相信随着SBOM相关技术的不断发展,未来此类工具的功能也会有较大的提升。
## **影响及趋势预判**
美行政令EO 14028虽然对《SBOM最小要素》的制定进行了要求,但并未对它的使用进行强制规定。最小要素和本手册可更多的被看作是对SBOM相关方,特别是美国软件供应商的规范建议。
但另一方面,随着全球网络信息领域对软件供应链安全、SBOM重要性认知的不断提升,以及SPDX成为国际标准、《SBOM最小要素》的出台等,软件供应企业(如商用软件、外包软件)和个人(如开源软件)会越来越多主动或被动的构造并提供SBOM,本手册可以在这一方面提供流程的规范和指导,具有积极的促进作用。无论美国厂商还是全球厂商都可以从中得到启示,但手册介绍的粒度较粗,供应商应根据自身状况进一步细化后使用。
SBOM生成的自动化是构造SBOM的最终目标和提高效率的有效手段,但从手册中可以看出,目前一些类型信息的收集还难以做到,例如“已知的未知情况”、遗留系统的相关信息等,并且手册也缺少对这些的详细方法介绍;此外,依赖项漏洞是软件供应链安全风险的主要成因之一,手册中列举了几类需在SBOM中重点关注的内外部依赖关系,但并未展开系统阐述。未来应对这些问题进行进一步的研究,进而为软件供应商提供更加明确的指导。
## **总结及对策建议**
手册归纳了SBOM生成的一般工作流程,包括“识别组件-获取数据-构造SBOM-验证SBOM”4个步骤,并以构建为阶段划分点,讨论了SBOM构造的主要方法,还重点分析了SBOM应包含的内外部依赖关系、列举了针对SBOM的验证工具和标准。基于上述情况,本文对我国的SBOM构造工作建议如下:
- 建议国家或行业监管部门指导制定软件SBOM格式、生成和使用等方面的标准和指南,以规范该项工作;并建立有效的机制推动标准的落地、使用,引导相关自动化辅助工具的研发。
- 建议软件供应商提高安全责任意识,根据已有的SBOM要素、生成、使用等参考资料制定满足自身和使用者需求的SBOM规范,包括但不限于组件供应者、组件名称、组件版本、依赖关系等信息内容,并在软件研发和供应过程中严格执行。
- 建议软件使用者将SBOM列为供应商必须提供的内容,并对其提交的软件产品和SBOM进行验证,以确保两者的对应关系,从而提升软件产品的透明度,提高软件安全维护的效率和使用的安全性。
手册原文可参考:https://www.ntia.gov/files/ntia/publications/software\_suppliers\_sbom\_production\_and\_provision\_-\_final.pdf
SBOM系列政策文件研究由中国信通院、中国联通联合牵头,筹建单位奇安信、会员单位悬镜安全、绿盟、高伟达、比瓴、盈高科技、亚信、北银金科、孝道科技、南阳理工大学、华为支持开展,包含13篇政策文件的翻译、解读,涵盖了SBOM整体内容概述,SBOM的生成、获取、交换、共享、管理、使用等全生命周期过程,回答了关于SBOM的常见问题,以期助力社区的安全研究研讨,加速推进提升国内供应链的安全管理水平。
@@ -0,0 +1,95 @@
---
page-title: "什麼是SBOM (軟體物料清單)? - 網路安全解決方案 - 艾索科技"
url: https://www.aisol.com.tw/index.php?action=solution&cid=23&id=197
date: "2023-03-07 09:20:31"
---
## **什麼是SBOM(軟體物料清單)**
讓我們從基礎開始,當談論到 SBOM 時,我們是什麼意思呢?
SBOM (全名為 Software Bill of Materials,軟體物料清單) 最初由美國食品和藥物管理局(FDA)於2018年提出,作為醫療器械網路安全管理上市前提交的一部分。然後,它們被稱為網路安全材料清單(CBOM),強調它們對產品安全的重要性。目標是創建構成設備的所有軟體和硬體元件的清單。它使組織能夠有效地管理其資產並充分瞭解所使用軟體的風險。
## **供應鏈安全和 SBOM**
隨著軟體供應鏈攻擊的威脅,這使得SBOM成為確保供應鏈安全(Supply Chain Security)的關鍵。
在過去幾年中,軟體供應鏈攻擊已開始佔據各家媒體頭條。考慮到軟體和供應鏈變得多越來越複雜和多層次,這並不奇怪。今天的互聯設備和產品可以依賴來自多個來源的數十甚至數百個軟體庫:有一些是內部開發的,另一些是從第三方供應商處購買的,並添加到組合中的是開源專案。
此外,大流行造成的嚴重供應鏈中斷,導致關鍵業務供應鏈短缺。供應鏈延遲和故障促使設備和產品製造商尋找新的和未經審查的供應商,也讓供應鏈風險管理增加了另一個挑戰。
## **經典案例:SOLARWINDS 和 LOG4SHELL**
2020年的SolarWinds供應鏈攻擊深入到聯邦政府的基礎設施以及一些最大、最精通技術的組織中,這引發了一個問題,就是我們究竟對每天使用的軟體瞭解多少?我們了解產品和設備的構成基礎嗎?
另一個發人深省的例子是,第三方和開源元件在我們的軟體和設備中無處不在,這是2021年底在廣受歡迎和無處不在的Log4j開源Java庫中發現的關鍵漏洞。一旦披露,該漏洞就清楚地表明瞭開源元件的固有風險,這些元件是我們軟體產品不可分割的一部分。通過漏洞進行的令人瞠目結舌的漏洞利用嘗試次數 - 在其披露后的幾個小時內,這緊急提醒我們,對我們供應鏈中開源元件的可見性和控制是漏洞管理的關鍵部分。
如果做得好,SBOM允許我們檢查和監控通過供應鏈收到的元件,並在威脅和漏洞成為頭條新聞之前對其進行管理。
## **美國拜登總統的網絡安全行政命令 (EO 14028) 使 SBOM 成為必要**
2021 年 5 月,為了應對日益增加的供應鏈攻擊威脅,例如 SolarWinds 漏洞,拜登總統發布了一項關於改善國家安全的行政命令 (EO 14028)。 EO 14028 呼籲組織和聯邦機構共同努力改善網絡安全。
這一行動的一部分是建議軟體開發人員向他們的客戶提供 SBOM。 該軟體材料清單包括有關應用程序使用的庫、附加組件和自定義源代碼的信息。
## **SBOM 使用案例**
雖然行政命令明確表示我們越來越需要使用SBOM進行監管,但一些公司組織仍然認為法規只是必須忍受的必要邪惡,而不是利用可以提高其安全性和合規性戰略和流程的工具。當持續使用工具時,SBOM 可以幫助產品安全團隊在整個產品生命週期(從開發的最早階段到後期生產)中檢測和降低風險。
除了作為法規要求,SBOM對於管理軟體供應鏈風險的軟體或數位產品製造商來說也是一種至關重要的做法。在幾個使用範例中,SBOM 提供了它的價值。
- **符合聯邦要求**
在拜登總統的行政命令之後,那些向聯邦政府提供軟體的人需要提供SBOM,詳細說明所使用的元件以及版本之間的更改。
- **降低軟體消費者的風險**
SBOM 提供對軟體組成的可見性,使組織能夠驗證軟體是否符合其合規性標準和安全要求,並評估風險。這對於高度監管的行業(如醫療保健、關鍵基礎設施供應商/公用事業、汽車和金融)尤為重要。
- **向左轉移,以更快地將優質產品推向市場**
設備製造商對其產品有很高的標準,在許多情況下,在生產後進行更改的能力有限。SBOM 允許他們跟蹤上游軟體中的更改,以便在生產早期識別和修復新漏洞,此時修復起來更容易且成本更低。
- **支援併購**
在收購新公司時,企業需要在收購前完成盡職調查,調查其投資。此過程的一部分涉及徹底評估購買風險。SBOM 提供對公司在其產品開發中使用的軟體的可見性,從而能夠更準確地評估產品和設備。
## **數位孿生技術協助建立精準的SBOM**
艾索科技提供的解決方案是利用網路 Digital Twins 技術,為您提供了大規模開發和維護安全產品的基礎架構,可以統一管理產品生產前的安全評估與產品開發後的安全運營,為您提供在產品的整個生命週期內保護產品所需的可見性、上下文和敏捷性,最重要的是它無需原始程式碼。
## **艾索科技協助您進行 SBOM (軟體物料清單) 管理**
艾索科技將協助您獲取整個產品組件的詳細且持續更新的 SBOM,讓OEM及其供應商能夠開發和維護安全產品的每一步。
我們可以在所有開發計劃中全面瞭解您的軟體組成清單 (SBOM),從而增強問責制和產品安全性。
- ### **完整的資產可視性**
通過產品的標準化網路Digital Twin,將自動全面了解您的產品組成,包括 SBOM、版本控制、依賴關係、許可證、操作系統配置等等
- ### **產品組合影響分析**
在產品的開發期間和開發後,自動檢測整個資產清單中的漏洞,並在漏洞被利用之前,我們將建議您如何對其進行修復。
- ### **清單分析**
按地理位置、營業單位或開發計劃等各種屬性,對資產清單進行切片和切塊,並從資產(元件)向下鑽取到 SBOM 再到漏洞
- ### **SBOM 到設備的可見性**
與您的 PLM、QMS、ERP 和遠端更新系統無縫集成,將清單可見性從 SBOM 擴展到產品 ID,從而暴露相關風險
- **端到端的可追溯性**
查明元件和產品中的漏洞和安全漏洞,並在從設計到後期製作的任何生命周期階段追溯其來源
****想了解更多關於 產品安全與網路安全 解決方案,歡迎與[艾索科技聯繫](https://www.aisol.com.tw/index.php?action=contact) !****
**艾索科技股份有限公司 AISOL Technology**
- 電話:02-2500-6210
- 郵件:info@aisol.com.tw
@@ -0,0 +1,203 @@
---
page-title: "关于软件物料清单(SBOM),你所需要了解的一切 - Seal软件 - 博客园"
url: https://www.cnblogs.com/sealio/p/16891458.html
date: "2023-03-07 09:27:54"
---
在此前的多篇文章中,我们已经详细地介绍了软件物料清单(SBOM)对于保障软件供应链安全的重要性以及一些注意事项。在本文中,我们将会更深入地介绍SBOM,包括最低要求元素、格式、使用场景以及如何对其进行管理等。
 
## SBOM所包含的元素
2021年年中,NTIA发布了软件物料清单(SBOM)的最少必需元素。这些元素包含以下三类:
- 数据字段:每个软件组件的基本信息
- 自动化支持:能够自动生成机器可读格式的SBOM
- 实践和流程:SBOM 应该如何及何时生成和分发
所需元素的目的是为 SBOM 使用者提供他们所需的信息,以管理漏洞、清点软件组件,并监管许可证合规性。
### 数据字段
根据NTIA的说法,这一字段是为了“充分识别这些组件以在整个软件供应链中跟踪它们,并将它们映射到其他相关的数据来源,如漏洞数据库或许可证数据库”。
 
7个必要的数据字段如下:
- **供应商名称:** 开发该软件组件的个人或组织
- **组件名称:** 给一组软件命名,通常由供应商决定
- **组件版本:** 一个标识符,指定软件与以前版本的变化。同样,这是由供应商决定的
- **其他独特标识符:** 像Software Identification SWID)标签、Package Uniform Resource Locators PURL)、Common Platform EnumerationCPE)或类似的标识符,可以帮助SBOM 消费者在关键数据库中找到组件
- **依赖项关系:** 表示软件组件是如何结合在一起的,如,某个上游组件包含在某个软件中
- **SBOM数据的作者:** 生成SBOM元数据的实体,可能是软件供应商或其他个人、团体
- **时间戳:** SBOM 生成的日期和时间
### 自动化支持
下一组最低要求元素是指 SBOM 数据在整个软件生态系统内部以及跨组织通信的方式。这一要求的目标是为了确保 SBOM 数据真正可用——不仅仅是机器可读,还能够让人直接阅读,而且它的传输格式是可互操作的。
 
要达到这一目标,NTIA 认证了3个交付格式来生成和消费 SBOM。至关重要的是,向联邦政府销售软件的组织必须以这三种格式之一传送 SBOM,以符合网络安全行政命令的要求。
 
这3个格式是:
- Software Package Data Exchange (SPDX)
- Software Identification (SWID) Tags
- CycloneDX
 
在后面一节,我们将会对这3个格式进行详细介绍。
 
### 实践和流程
最后一组SBOM最低要求元素涉及生成和申请SBOM的具体操作。具体而言,实践和流程部分包括以下6个方面的要求:
- **频率(Frequency):** NTIA规定,“如果软件组件随着新的构建或发布而更新”,企业应该生成新的SBOM。此外,供应商在以下情况下也需要生成新的SBOM:
1)需要纠正原始版本中的错误
2)了解有关软件组件的新细节
 
- **深度(Depth):** 合规的SBOM需要包含:
1)所有顶层组件
2)所有间接依赖关系。如果SBOM作者不能包含所有间接依赖关系,则需要囊括足够的信息,使消费者可以递归地找到他们。
 
- **已知的未知因素(Known Unknowns):** 在SBOM作者没有提供完整的依赖关系图的情况下,他们需要说明这是因为:
1)该组件没有进一步的依赖关系,或者
2)不知道是否存在其他的依赖关系。
 
- **分发和交付:** 这一部分分为几个环节,都是关于确保SBOM以可消化的格式快速交付。首先,SBOM被要求以“及时”的方式提供(尽管没有设定天数或周数)。其次,他们必须有“适当的”角色和访问权限。最后,SBOM可以与产品的每个实例一起分发或者以其他可访问的方式提供,如公开的网站。
 
- **访问控制:** 如果供应商想将SBOM数据的访问限制在某些客户或用户,他们需要提供这种访问控制的条款。此外,供应商需要提供 “具体的允许和便利”,以便SBOM消费者能够将数据纳入其安全工具。
 
- **容错程度:** 网络安全行政命令和指导SBOM创建的法规目前尚不成熟,因此,各组织被指示要对(无意的)错误或遗漏给予理解。
 
## SBOM交付格式及规范
企业可以通过各种不同的格式创建和发布软件物料清单(SBOM)。对于一个想要在其网站发布 SBOM 的企业来说,HTML 是一个合理的选择。如果 SBOM 中包含了文档或者源代码,那么纯文本也许是更佳选项。此外,还有 Markdown、PDF、CSV等格式可供使用。
 
除了这些常见的格式外,还有几种专门为交付SBOM而设计的格式,如 SPDX(软件包数据交换),SWID Tags(软件识别)以及Cyclone DX。
 
### SPDX
SPDX是由 Linux 基金会运营的项目,旨在标准化企业共享和使用SBOM中信息的方式。SPDX 捕捉与provenance、许可证和安全相关的数据,下图展示了 SPDX 文档中所包含的数据:
![](https://img2022.cnblogs.com/blog/2903698/202211/2903698-20221115095911332-851914439.png)
- JSON(你可以在 GitHub 上找到SPDX的JSON schema[https://github.com/spdx/spdx-spec/tree/development/v2.2.1/schemas](https://github.com/spdx/spdx-spec/tree/development/v2.2.1/schemas%EF%BC%89)
- RDF/XML
- tag:value flat text file
- .xls 电子表格
 
Seal 软件供应链防火墙可以直接生成SPDX格式的SBOM文件,欢迎访问下方链接申请产品试用: [seal.io/trail](https://www.cnblogs.com/sealio/p/seal.io/trail)
 
### SWID Tags
SWID 是一个标准化的 XML 格式,可以识别软件产品的组成部分并将其与上下文结合。4种类型的 SWID Tags 在软件开发生命周期中:
- **Corpus Tags** 识别和描述在安装前阶段的软件成分。根据 NIST 给出的定义,corpus tags 是指“软件安装工具和流程的输入”
- **Primary Tags** 在软件产品安装后对其进行识别和关联
- **Patch Tags** 顾名思义,patch tags 可以识别和描述补丁(而不是核心产品本身)。此外,patch tags 包含了补丁和其他产品或补丁之间的上下文关系信息。
- **Supplemental Tags** SWID 格式仅允许 tag 创建者修改 corpus、primary和patch tags。但是 Supplemental Tags 可以让软件用户及软件管理工具在本地添加有益的上下文信息,如许可证密钥以及相关方的联系信息。
 
在决定将哪些标签和具体的数据元素纳入其产品时,各企业有一定程度的灵活性。在SWID规范中,除了几个必须的字段外,其他的元素和属性都是可选的。
 
最终,一个最低限度的有效和符合要求的标签只需要描述软件产品(如名称和标签ID)和创建它的实体的少数元素。关于SWID标签数据元素的最全面和最新的信息,建议查看ISO/IEC 19770-2:2015标准全文:
[https://www.iso.org/standard/65666.html](https://www.iso.org/standard/65666.html)
 
### Cyclone DX
Cyclone DX 是一个轻量级软件物料清单标准,旨在用于应用安全上下文和供应链组件分析。换言之,它旨在实现与SPDX、SWID以及其他所有SBOM交付格式类似的目标——提供构成一个应用程序的软件组件的关键信息。
 
Cyclone DX 支持以下4种类型的数据:
- **物料清单元数据:** 关于应用/产品本身的信息——供应商、制造商、SBOM所面熟的组件以及用于汇编SBOM的任意工具
- **组件:** 完整的专利清单及开源组件清单,包含许可信息
- **服务信息:** 软件可能调用的外部API、终端URI、身份认证要求和信任名单
- **依赖项:** 包含直接依赖项和间接依赖项
 
## 谁是SBOM的目标受众?
历史上,SBOM主要由合规团队用来审计、监控许可证以及遵守行业特定规范,但随着软件供应链攻击的上升,包括 SolarWinds 黑客事件和去年年末的 Log4Shell 漏洞,SBOM 的使用扩展到了安全和开发团队。
### 安全团队
对于安全团队来说,SBOM扮演着十分重要的角色,特别是需要进行漏洞扫描的时候。因为扫描SBOM库比从头开始扫描整个基础设施更简单也更快,在发生零日事件时,每一分钟都很重要。此外,安全团队也会利用 SBOM 所提供的信息(如风险所在位置)来确定问题修复的优先级,并针对特定组件创建策略,如供应商的选型、可引入的版本或者软件包类型等。
 
### 开发团队
开发团队可以使用 SBOM 来跟踪他们所开发、管理和运维的各个软件中的组件,包括开源组件、商业组件和自研组件。并且 SBOM 还能协助开发团队管理依赖项、识别安全问题以减少其重复的工作,还能确保开发人员使用的都是经过审批的代码和可信任的源。
 
## SBOM 的应用场景
显然,有许多令人信服的理由推动企业创建SBOM,并且企业可以为所有产品创建SBOM,每个新版本都可以更新一版SBOM。此外,在一些特定场景中SBOM会最大限度地发挥其作用。
 
- **融资、并购和IPO** 软件物料清单是收购、IPO或融资过程中技术尽调的重要一环。相关利益方会要求获取文档以更好地了解产品中的软件成分以及许可证合规性、安全性或代码质量风险。
- **客户要求:** 由于全球范围内的企业都将防止软件供应链风险的优先级提高了,因此未来会有越来越多的企业要求采购环节中需要提供SBOM。
- **向下兼容:** 维护大量旧软件的公司经常需要进行OSS包的更新和升级。当然,如果对这些旧产品中的开放源码软件有一个完整的清单,做起来就容易多了。
 
## 全面管理 SBOM 的最佳实践
随着SBOM被迅速接受,行业领导者已经开始开发创建、管理和使用SBOM 的方法。这些实践跨越了软件生命周期的各个关键阶段:
 
**1、在统一的存储库中存储和管理 SBOM**
虽然单个开发或应用团队可以将SBOM与他们的代码构件一起存储在存储库中,但安全团队必须在所有应用和开发团队中维护一个统一的SBOM存储库。当新的漏洞或安全事件出现时,安全团队和CISO需要快速查询所有软件的SBOM并即时评估影响,而不是分别从每个团队中获得单独的评估报告,或者不得不浪费事件从头开始查找和重新扫描他们所有的应用程序。此外,满足监管要求或合规标准也需要一个集中的存储库,用于生成报告和其他的合规活动。
 
**2、要求所有进入供应链的软件提供SBOM**
企业如果需要对所使用的软件保有可见性,那么收集 SBOM 信息以分析软件成分或应用是十分重要的。如果是第三方商业软件,那么软件供应商应该提供必要的 SBOM,并将其纳入你的 SBOM 资源库。
 
当使用的是开源组件来构建自定义软件时,在将其引入开发流程前企业应该直接扫描开源构件(如容器镜像)或者开源代码仓库。在某些情况下,开源项目可能会提供一个签名的 SBOM,这可以让企业将他们生成的 SBOM 与社区提供的 SBOM 进行比较来进行验证。
 
**3、为每个开发环节和构建生成SBOM**
各行各业的企业正在定制软件以迎合其独特的市场需求。大部分软件都由大量的开源代码组成(根据不同的应用程序,开源代码的占比在50—90%之间)以及内部开发的代码和第三方库。由于在构建阶段开源代码常常会引入额外的依赖项,因此在开发流程中的每一步及每一次构建软件时都扫描您的软件是至关重要的。这可以让您检测出意料之外的SBOM变更,这些变更可能由新依赖项或代码修改导致的。这些 SBOM 需要标记为特殊组件或他们所代表的应用程序。
 
**4、为你所部署或交付的每个软件版本创建综合的SBOM**
无论您是将软件交付给客户,还是帮助客户、员工、合作伙伴进行部署,您应该创建一个综合的SBOM,并标记为该版本软件的变更。这提供了一个追踪机制,可以让企业快速评他们生产的应用或组件的安全状况,同时评估新漏洞对此前开发的影响。对于将软件售卖或提供给外部用户的企业,您也可以提供必要的可见性和“信任报告”给软件的下游用户。
 
**5、 将自动化应用于策略执行和告警**
借助中心化的SBOM仓库和有效的SBOM管理能力,企业可以利用一个自动的策略引擎来应用策略规则,如同步特殊的监管要求或合规标准。同时,还可以应用任意内部要求。自动告警可以提醒您新漏洞或违反策略的行为,如此,受影响的团队可以快速修正重要问题并阻止受影响的镜像被部署。
 
## 借助工具生成SBOM
可以肯定的是,软件物料清单将在业务开展方式中发挥越来越重要的作用。但是,考虑到制作SBOM所需的数据量,仅通过人工将这些碎片组合在一起是相当具有挑战性的。Seal 软件供应链防火墙可以生成SBOM数据,并可以跟踪SBOM的变化以进行漏洞匹配,及时发现软件供应链中的安全风险。
  ![](https://img2022.cnblogs.com/blog/2903698/202211/2903698-20221115095752939-1699376170.png)
@@ -0,0 +1,164 @@
---
page-title: "关于软件物料清单(SBOM),你所需要了解的一切 - 掘金"
url: https://juejin.cn/post/7166054417819500580
date: "2023-03-23 17:32:57"
---
在此前的多篇文章中,我们已经详细地介绍了软件物料清单(SBOM)对于保障软件供应链安全的重要性以及一些注意事项。在本文中,我们将会更深入地介绍SBOM,包括最低要求元素、格式、使用场景以及如何对其进行管理等。  
## SBOM所包含的元素
2021年年中,NTIA发布了软件物料清单(SBOM)的最少必需元素。这些元素包含以下三类:
- 数据字段:每个软件组件的基本信息
- 自动化支持:能够自动生成机器可读格式的SBOM
- 实践和流程:SBOM 应该如何及何时生成和分发
所需元素的目的是为 SBOM 使用者提供他们所需的信息,以管理漏洞、清点软件组件,并监管许可证合规性。
### 数据字段
根据NTIA的说法,这一字段是为了“充分识别这些组件以在整个软件供应链中跟踪它们,并将它们映射到其他相关的数据来源,如漏洞数据库或许可证数据库”。  
7个必要的数据字段如下:
- **供应商名称:** 开发该软件组件的个人或组织
- **组件名称:** 给一组软件命名,通常由供应商决定
- **组件版本:** 一个标识符,指定软件与以前版本的变化。同样,这是由供应商决定的
- **其他独特标识符:** 像Software Identification SWID)标签、Package Uniform Resource Locators PURL)、Common Platform EnumerationCPE)或类似的标识符,可以帮助SBOM 消费者在关键数据库中找到组件
- **依赖项关系:** 表示软件组件是如何结合在一起的,如,某个上游组件包含在某个软件中
- **SBOM数据的作者:** 生成SBOM元数据的实体,可能是软件供应商或其他个人、团体
- **时间戳:** SBOM 生成的日期和时间
### 自动化支持
下一组最低要求元素是指 SBOM 数据在整个软件生态系统内部以及跨组织通信的方式。这一要求的目标是为了确保 SBOM 数据真正可用——不仅仅是机器可读,还能够让人直接阅读,而且它的传输格式是可互操作的。  
要达到这一目标,NTIA 认证了3个交付格式来生成和消费 SBOM。至关重要的是,向联邦政府销售软件的组织必须以这三种格式之一传送 SBOM,以符合网络安全行政命令的要求。  
这3个格式是:
- Software Package Data Exchange (SPDX)
- Software Identification (SWID) Tags
- CycloneDX  
在后面一节,我们将会对这3个格式进行详细介绍。  
### 实践和流程
最后一组SBOM最低要求元素涉及生成和申请SBOM的具体操作。具体而言,实践和流程部分包括以下6个方面的要求:
- **频率(Frequency):** NTIA规定,“如果软件组件随着新的构建或发布而更新”,企业应该生成新的SBOM。此外,供应商在以下情况下也需要生成新的SBOM: 1)需要纠正原始版本中的错误 2)了解有关软件组件的新细节  
- **深度(Depth):** 合规的SBOM需要包含: 1)所有顶层组件 2)所有间接依赖关系。如果SBOM作者不能包含所有间接依赖关系,则需要囊括足够的信息,使消费者可以递归地找到他们。  
- **已知的未知因素(Known Unknowns):** 在SBOM作者没有提供完整的依赖关系图的情况下,他们需要说明这是因为: 1)该组件没有进一步的依赖关系,或者 2)不知道是否存在其他的依赖关系。  
- **分发和交付:** 这一部分分为几个环节,都是关于确保SBOM以可消化的格式快速交付。首先,SBOM被要求以“及时”的方式提供(尽管没有设定天数或周数)。其次,他们必须有“适当的”角色和访问权限。最后,SBOM可以与产品的每个实例一起分发或者以其他可访问的方式提供,如公开的网站。  
- **访问控制:** 如果供应商想将SBOM数据的访问限制在某些客户或用户,他们需要提供这种访问控制的条款。此外,供应商需要提供 “具体的允许和便利”,以便SBOM消费者能够将数据纳入其安全工具。  
- **容错程度:** 网络安全行政命令和指导SBOM创建的法规目前尚不成熟,因此,各组织被指示要对(无意的)错误或遗漏给予理解。  
## SBOM交付格式及规范
企业可以通过各种不同的格式创建和发布软件物料清单(SBOM)。对于一个想要在其网站发布 SBOM 的企业来说,HTML 是一个合理的选择。如果 SBOM 中包含了文档或者源代码,那么纯文本也许是更佳选项。此外,还有 Markdown、PDF、CSV等格式可供使用。  
除了这些常见的格式外,还有几种专门为交付SBOM而设计的格式,如 SPDX(软件包数据交换),SWID Tags(软件识别)以及Cyclone DX。  
### SPDX
SPDX是由 Linux 基金会运营的项目,旨在标准化企业共享和使用SBOM中信息的方式。SPDX 捕捉与provenance、许可证和安全相关的数据,下图展示了 SPDX 文档中所包含的数据:
![1.png](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/2002f823f7534b0e8f10630c84913355~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.awebp?)
该格式支持以下文件类型:
- YAML
- JSON(你可以在 GitHub 上找到SPDX的JSON schema[github.com/spdx/spdx-s…](https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fspdx%2Fspdx-spec%2Ftree%2Fdevelopment%2Fv2.2.1%2Fschemas%25EF%25BC%2589 "https://github.com/spdx/spdx-spec/tree/development/v2.2.1/schemas%EF%BC%89")
- RDF/XML
- tag:value flat text file
- .xls 电子表格  
Seal 软件供应链防火墙可以直接生成SPDX格式的SBOM文件,欢迎访问下方链接申请产品试用: [seal.io/trail](https://link.juejin.cn/?target=seal.io%2Ftrail "seal.io/trail")
### SWID Tags
SWID 是一个标准化的 XML 格式,可以识别软件产品的组成部分并将其与上下文结合。4种类型的 SWID Tags 在软件开发生命周期中:
- **Corpus Tags** 识别和描述在安装前阶段的软件成分。根据 NIST 给出的定义,corpus tags 是指“软件安装工具和流程的输入”
- **Primary Tags** 在软件产品安装后对其进行识别和关联
- **Patch Tags** 顾名思义,patch tags 可以识别和描述补丁(而不是核心产品本身)。此外,patch tags 包含了补丁和其他产品或补丁之间的上下文关系信息。
- **Supplemental Tags** SWID 格式仅允许 tag 创建者修改 corpus、primary和patch tags。但是 Supplemental Tags 可以让软件用户及软件管理工具在本地添加有益的上下文信息,如许可证密钥以及相关方的联系信息。  
在决定将哪些标签和具体的数据元素纳入其产品时,各企业有一定程度的灵活性。在SWID规范中,除了几个必须的字段外,其他的元素和属性都是可选的。  
最终,一个最低限度的有效和符合要求的标签只需要描述软件产品(如名称和标签ID)和创建它的实体的少数元素。关于SWID标签数据元素的最全面和最新的信息,建议查看ISO/IEC 19770-2:2015标准全文: [www.iso.org/standard/65…](https://link.juejin.cn/?target=https%3A%2F%2Fwww.iso.org%2Fstandard%2F65666.html "https://www.iso.org/standard/65666.html")  
### Cyclone DX
Cyclone DX 是一个轻量级软件物料清单标准,旨在用于应用安全上下文和供应链组件分析。换言之,它旨在实现与SPDX、SWID以及其他所有SBOM交付格式类似的目标——提供构成一个应用程序的软件组件的关键信息。  
Cyclone DX 支持以下4种类型的数据:
- **物料清单元数据:** 关于应用/产品本身的信息——供应商、制造商、SBOM所面熟的组件以及用于汇编SBOM的任意工具
- **组件:** 完整的专利清单及开源组件清单,包含许可信息
- **服务信息:** 软件可能调用的外部API、终端URI、身份认证要求和信任名单
- **依赖项:** 包含直接依赖项和间接依赖项  
## 谁是SBOM的目标受众?
历史上,SBOM主要由合规团队用来审计、监控许可证以及遵守行业特定规范,但随着软件供应链攻击的上升,包括 SolarWinds 黑客事件和去年年末的 Log4Shell 漏洞,SBOM 的使用扩展到了安全和开发团队。
### 安全团队
对于安全团队来说,SBOM扮演着十分重要的角色,特别是需要进行漏洞扫描的时候。因为扫描SBOM库比从头开始扫描整个基础设施更简单也更快,在发生零日事件时,每一分钟都很重要。此外,安全团队也会利用 SBOM 所提供的信息(如风险所在位置)来确定问题修复的优先级,并针对特定组件创建策略,如供应商的选型、可引入的版本或者软件包类型等。  
### 开发团队
开发团队可以使用 SBOM 来跟踪他们所开发、管理和运维的各个软件中的组件,包括开源组件、商业组件和自研组件。并且 SBOM 还能协助开发团队管理依赖项、识别安全问题以减少其重复的工作,还能确保开发人员使用的都是经过审批的代码和可信任的源。  
## SBOM 的应用场景
显然,有许多令人信服的理由推动企业创建SBOM,并且企业可以为所有产品创建SBOM,每个新版本都可以更新一版SBOM。此外,在一些特定场景中SBOM会最大限度地发挥其作用。  
- **融资、并购和IPO** 软件物料清单是收购、IPO或融资过程中技术尽调的重要一环。相关利益方会要求获取文档以更好地了解产品中的软件成分以及许可证合规性、安全性或代码质量风险。
- **客户要求:** 由于全球范围内的企业都将防止软件供应链风险的优先级提高了,因此未来会有越来越多的企业要求采购环节中需要提供SBOM。
- **向下兼容:** 维护大量旧软件的公司经常需要进行OSS包的更新和升级。当然,如果对这些旧产品中的开放源码软件有一个完整的清单,做起来就容易多了。  
## 全面管理 SBOM 的最佳实践
随着SBOM被迅速接受,行业领导者已经开始开发创建、管理和使用SBOM 的方法。这些实践跨越了软件生命周期的各个关键阶段:  
**1、在统一的存储库中存储和管理 SBOM** 虽然单个开发或应用团队可以将SBOM与他们的代码构件一起存储在存储库中,但安全团队必须在所有应用和开发团队中维护一个统一的SBOM存储库。当新的漏洞或安全事件出现时,安全团队和CISO需要快速查询所有软件的SBOM并即时评估影响,而不是分别从每个团队中获得单独的评估报告,或者不得不浪费事件从头开始查找和重新扫描他们所有的应用程序。此外,满足监管要求或合规标准也需要一个集中的存储库,用于生成报告和其他的合规活动。  
**2、要求所有进入供应链的软件提供SBOM** 企业如果需要对所使用的软件保有可见性,那么收集 SBOM 信息以分析软件成分或应用是十分重要的。如果是第三方商业软件,那么软件供应商应该提供必要的 SBOM,并将其纳入你的 SBOM 资源库。  
当使用的是开源组件来构建自定义软件时,在将其引入开发流程前企业应该直接扫描开源构件(如容器镜像)或者开源代码仓库。在某些情况下,开源项目可能会提供一个签名的 SBOM,这可以让企业将他们生成的 SBOM 与社区提供的 SBOM 进行比较来进行验证。  
**3、为每个开发环节和构建生成SBOM** 各行各业的企业正在定制软件以迎合其独特的市场需求。大部分软件都由大量的开源代码组成(根据不同的应用程序,开源代码的占比在50—90%之间)以及内部开发的代码和第三方库。由于在构建阶段开源代码常常会引入额外的依赖项,因此在开发流程中的每一步及每一次构建软件时都扫描您的软件是至关重要的。这可以让您检测出意料之外的SBOM变更,这些变更可能由新依赖项或代码修改导致的。这些 SBOM 需要标记为特殊组件或他们所代表的应用程序。  
**4、为你所部署或交付的每个软件版本创建综合的SBOM** 无论您是将软件交付给客户,还是帮助客户、员工、合作伙伴进行部署,您应该创建一个综合的SBOM,并标记为该版本软件的变更。这提供了一个追踪机制,可以让企业快速评他们生产的应用或组件的安全状况,同时评估新漏洞对此前开发的影响。对于将软件售卖或提供给外部用户的企业,您也可以提供必要的可见性和“信任报告”给软件的下游用户。  
**5、 将自动化应用于策略执行和告警**
借助中心化的SBOM仓库和有效的SBOM管理能力,企业可以利用一个自动的策略引擎来应用策略规则,如同步特殊的监管要求或合规标准。同时,还可以应用任意内部要求。自动告警可以提醒您新漏洞或违反策略的行为,如此,受影响的团队可以快速修正重要问题并阻止受影响的镜像被部署。  
## 借助工具生成SBOM
可以肯定的是,软件物料清单将在业务开展方式中发挥越来越重要的作用。但是,考虑到制作SBOM所需的数据量,仅通过人工将这些碎片组合在一起是相当具有挑战性的。Seal 软件供应链防火墙可以生成SBOM数据,并可以跟踪SBOM的变化以进行漏洞匹配,及时发现软件供应链中的安全风险。  
![2.png](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/f1e8fc7f24dd4464b071eb2de35aa749~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.awebp?)
@@ -0,0 +1,89 @@
---
page-title: "如何使用微软的开源工具生成 SBOM - 知乎"
url: https://zhuanlan.zhihu.com/p/571994012
date: "2023-03-07 09:23:23"
---
![](https://pic1.zhimg.com/v2-84239cea1794a6ab3498be79b7ea5e58_b.jpg)
SBOM (软件物料清单)通过列出您的代码所依赖的软件包和供应商来帮助您了解您的软件供应链。SBOM 正迅速获得发展势头,作为在现实世界供应链受到重大攻击后帮助提高安全性的一种方式。
SBOM 的主要支持者之一是微软,该公司早在 2021 年 10 月就发布了针对他们这一代的方法。今年早些时候,该公司开源了其用于在 Windows、macOS 和 Linux 上生成 SBOM 的工具。
在本文中,您将学习如何开始使用该项目来索引代码的依赖项。它生成与 SPDX 兼容的文档,列出项目中的文件、包和关系。SPDX(软件包数据交换)是 ISO 接受的 SBOM 标准,因此您可以将生成的报告直接传递到其他生态系统工具。
微软最初以 Salus 的名义宣布了该项目。由于它与起源于 Coinbase的现有Salus 代码安全项目相冲突,因此从该术语中退出。SBOM 生成器现在简称为.sbom-tool
## 入门
您可以从 Microsoft 的GitHub 存储库下载 SBOM 工具。发布页面上提供了预编译的二进制文件。为您的系统选择正确的下载,然后制作二进制可执行文件并将其移动到您路径中的某个位置。
以下是 Linux 的示例:
`$ wget https://github.com/microsoft/sbom-tool/releases/download/v<VERSION>/sbom-tool-linux-x64 $ chmod +x sbom-tool-linux-x64 $ mv sbom-tool-linux-x64 /usr/local/bin/sbom-tool`
您应该能够运行sbom-tool以在终端窗口中显示帮助信息:
`$ sbom-tool No action was specified The Sbom tool generates a SBOM for any build artifact. Usage - Microsoft.Sbom.Tool <action> -options`
## 生成 SBOM
generate通过运行该工具的子命令可以创建新的 SBOM 。需要提供一些参数:
- \-b( BuildDropPath) 将生成的 SPDX SBOM 清单保存到的文件夹。
- \-bc( BuildComponentPath) – 将被扫描以查找项目中的依赖项的文件夹。
- \-nsb( NamespaceUriBase) 将用作 SBOM 清单的命名空间的基本路径。这应该是您的组织拥有的 URL,例如https://example.com/sbom.
SBOM Tool 还需要知道您的项目的名称和版本。它通常可以从存储库中已有的文件(例如package.json name和version字段)中推断出这一点,但在某些情况下,您可能需要手动提供信息或覆盖默认值。添加pn和pv标志来做到这一点:
- \-pn( PackageName) 您的项目或包的名称。
- \-pv( PackageVersion) – 您正在扫描的项目版本。这应该与您的 SBOM 随附的发布版本相匹配,以便用户可以将依赖项列表与特定构建相关联。
这是为工作目录中的文件生成 SBOM 的示例。SBOM 将被放置到sbom-output子目录中。这需要在您运行该工具之前存在。
`$ mkdir sbom-output $ sbom-tool generate -b sbom-output -bc . -pn example -pv 1.0 -nsb https://example.com/sbom`
扫描结果的概述将显示在您的终端中:
`[INFO] Enumerated 3728 files and 607 directories in 00:00:00.5938034 [INFO] |Component Detector Id |Detection Time |# Components Found |# Explicitly Referenced | ... [INFO] |Npm |0.63 seconds |241 |0 | ... [INFO] |Total |0.64 seconds |241 |0 | [INFO] Detection time: 0.6374678 seconds.`
这个项目使用 npm 来管理它的依赖。package.json该工具在工作目录的文件中检测到 241 个包。
SBOM Tool 目前支持 19 种不同的编程语言和包格式。该列表包括npm、NuGet、PyPi、Maven、Rust Crates 和 Ruby gem,以及 Docker 映像中存在的 Linux 包。还支持对远程 GitHub 存储库的引用。
## SBOM 内容
生成的 SBOM 将写入\_manifest/spdx\_2.2/manifest.spdx.json您指定的构建输出目录中。SBOM 是一个相当冗长的 JSON 文件,旨在供其他软件使用。
`{ "files": [], "packages": [ { "name": "color-convert", "SPDXID": "SPDXRef-Package-A72B0922E46D9828746F346D7FD11B7F81EDEB15B92BEEDAE087F5F7407FECDC", ... }`
报告中有四种主要类型的信息:
- 该files部分- 这列出了包含您在项目中编写的源代码的所有文件。SBOM 工具仅在扫描某些项目类型(例如 C# 解决方案)时才会填充此部分。
- 该packages部分- 项目中存在的所有第三方依赖项的完整目录,其中包含对其源包管理器的引用、使用的版本以及适用的许可证类型。
- 该relationships部分- 这详细说明了 SBOM 中列出的组件之间的所有关系。您将看到的最常见的关系是DEPENDS\_ON,它将packages节中的一项声明为项目的依赖项之一。还存在几种其他类型的关系,例如CREATED\_BY、DEPENDENCY\_OF和PATCH\_FOR。
- 报告元数据详细信息– 、 、等字段namedocumentNamespace并spdxVersion标识creationInfoSBOM、用于创建它的工具以及适用的SPDX 清单修订。
现在您已经有了一个 SBOM,您可以开始将它与其他工具一起使用来进行漏洞扫描和管理许可证合规性。您可以考虑将 SBOM 与您的软件版本一起分发,以便消费者能够检查每个新版本的内容。SBOM 最好作为构建管道的一部分生成,以便它们保持最新状态。
当出现重大的新供应链问题时,访问 SBOM 是非常宝贵的。例如,使用 SBOM 的组织可以更好地响应 Log4j。他们可以检查他们的报告以根据易受攻击的库快速找到项目,而不是手动审核包列表。
## 扫描 Docker 图像
作为报告生成的一部分,SBOM 工具能够扫描现有的 Docker 映像。要使用此功能,您需要添加-di标志并指定要扫描的图像标签或摘要。其余的论点保持不变。
`$ sbom-tool generate -di ubuntu:latest -b sbom-output -bc . -pn demo -pv 1.0 -nsb https://demo.com/demo`
将分析 Docker 映像以识别它包含的包。它们将与源文件夹中的依赖项一起添加到 SBOM 报告中。您可以在单个操作中扫描多个 Docker 映像,方法是用逗号分隔它们的标签或摘要哈希。
## 概括
SBOM Tool 是 Microsoft 开发的一个年轻的开源 SBOM 生成实用程序。它支持几种领先的包格式并产生与 SPDX 兼容的输出。这意味着您可以将生成的 SBOM 直接输入到 Grype 等其他工具中,以自动查找安全漏洞和过时的依赖项。
SBOM 是提高软件供应链意识和发现潜在问题的有效方法。制作和分发 SBOM 有助于用户了解他们的项目中默默包含的内容。SBOM 工具是使用单个命令生成行业标准报告的一种方法,可以更轻松地为每个版本提供 SBOM。
@@ -0,0 +1,134 @@
---
page-title: "如何通过SBOM(软件物料清单)实现安全治理_墨菲安全"
url: https://www.murphysec.com/blog/knowledge-popularization/4218.html
date: "2023-03-07 09:26:04"
---
[墨菲安全](https://www.murphysec.com/blog/author/chenshuang) • 2023年1月4日 18:17 • [知识普及](https://www.murphysec.com/blog/category/knowledge-popularization)
## 前言
SBOM(软件物料清单)是近年来在软件供应链领域频繁提到的概念,Linux基金会在2021年Q3调研了全球412 家机构发现已经有82%的人熟悉SBOM、78%的组织预计在今年使用SBOM。本文将介绍SBOM基本概念、实现方式、应用场景,帮助读者通过SBOM更高效地实现安全治理目标。
## 什么是SBOM
根据NTIA(美国国家电信和信息化管理局)的定义,SBOM(Software Bill of Materials,软件物料清单)是一份关于软件组件和依赖,包含它们的信息和层级关系的形式化、机器可读清单。
NTIA认为SBOM应该满足以下要求:
- 这份清单应该是全面,或者是明确识别范围的
- 应包含开源和闭源软件
- 能被广泛使用或者限制访问
还定义了SBOM中应该包含的最小化的软件组件信息(基线软件组件信息),包括:供应商名称、组件名称、唯一标识符、版本字符串、组件哈希、组件之间的关系、SBOM作者姓名。
在展现方式上,SBOM的信息可以通过图、表格等方式进行展现。
[![如何通过SBOM(软件物料清单)实现安全治理](https://www.murphysec.com/blog/wp-content/uploads/2023/01/asynccode-89.png)](https://www.murphysec.com/blog/wp-content/uploads/2023/01/asynccode-89.png)
(左图为SBOM最小化信息示例,右图为依赖关系图示例)
[![如何通过SBOM(软件物料清单)实现安全治理](https://www.murphysec.com/blog/wp-content/uploads/2023/01/asynccode-90.png)](https://www.murphysec.com/blog/wp-content/uploads/2023/01/asynccode-90.png)
(树状表格展示的SBOM信息示例)
SPDX (ISO/IEC 5962:2021) 是目前SBOM格式的事实标准,常见的格式还有SWID和CycloneDX,都能满足最小化的使用需求。
## SBOM的用途
根据Linux基金会的调研报告,人们普遍认为SBOM有三大收益:
- 51%的人表示,开发人员更容易理解应用程序中组件之间的依赖关系
- 49%的用户表示更容易监控组件的漏洞
- 44%的人指出,管理许可证合规变得更容易
## 依赖治理
当今软件开发的过程,如同开发人员使用一个个组件作为积木搭出高楼,随着软件变得越来越复杂,开发人员可能并不清楚用到了哪些组件、这些组件之间又存在什么样的依赖关系,一个个的积木如同黑箱般存在,维护起来只能小心翼翼,随时可能陷入下图中的依赖地狱。
[![如何通过SBOM(软件物料清单)实现安全治理](https://www.murphysec.com/blog/wp-content/uploads/2023/01/asynccode-91.png)](https://www.murphysec.com/blog/wp-content/uploads/2023/01/asynccode-91.png)
对于企业的工程团队而言,对于一些管理需求,例如规范某类组件的使用、避免重复开发以提升研发效率,首先需要了解企业内各种项目中使用到的组件,梳理对应的依存关系,才能做出有效的管理动作,这也迎合了当前比较火热的可见性需求。
一个组件版本碎片化的go语言项目可能会像下图这样,依赖了大量不同版本的同一组件。基于SBOM可以将碎片化的组件版本固定至一个或多个长期维护的稳定版本,避免版本无人维护导致产生bug无法解决。
## 漏洞管理
企业安全团队在面对新的漏洞、安全事件出现时,需要评估企业内有哪些资产受到影响,可以通过将漏洞的影响软件、版本范围等信息与已有SBOM进行关联,得到受影响资产列表,从而指导进一步的风险处置动作。
例如当出现新的类似log4j的漏洞时,可以通过SBOM以图的形式查找哪些内部项目中用到了log4j,通知这些项目的维护者进行漏洞修复。
无法复制加载中的内容
除了应急响应,在日常的风险管理中,可以基于SBOM计算每个项目存在依赖的漏洞风险,作为安全评价维度进行管理。(示意如下图)
无法复制加载中的内容
## 开源许可证合规
2021年罗盒公司的案件是中国法院首次认可了GPL许可证的效力,违反开源许可证也已经被越来越多的国家法律认定为侵权行为。为了降低软件侵权风险,企业需要识别软件中涉及的许可证,有效管理项目中涉及的许可证风险。
而由于许多开源许可证具有传递性,如果不能全面识别所涉及到的组件及对应的开源许可证信息,则可能忽略所开发软件需要遵循相应的开源许可证约束,比如需要提供源代码、需要对开源许可证进行标识。
如图中项目A引用了组件A,组件A使用了AGPL许可证,则项目A应该按照AGPL许可证的要求,不论修改或使用都应该开源。这样的场景对企业使用会有较多限制,应基于SBOM及时进行治理。
无法复制加载中的内容
## 如何生成SBOM
可以看到包括墨菲安全的客户端在内有不少的开源工具都可以生成SBOM,而有效的SBOM依赖软件成分分析能力和大量知识数据的储备。
## SCA(软件成分分析)
SBOM的生成依赖SCA技术,识别组件和版本,并输出对应的层级依赖关系。其复杂性在于
1)要适配不同的编程语言,而像java和c/c++这样不同语言的包管理机制会有较大差异;
2)要从源码、制品、二进制等不同形态的软件产物中解析提取特征,这些特征的提取策略依赖于对各类产物的理解。
## 知识库数据
除了SBOM中的基线字段信息外,漏洞、开源许可证也可以作为SBOM的附加信息,而这样的数据则强依赖于云端知识库的积累。
知识库需要实时跟踪当前的各种漏洞情报,并由人工运营加工;需要采集大量的代码、制品信息,分析依赖、计算哈希、提取特征等等,加工形成能和SCA工具结果匹配的特征数据。
## 如何发挥SBOM的作用
对于企业而言,要想充分发挥SBOM的作用,至少应该关注以下几点。
## SBOM及时更新
老旧的SBOM数据可能产生反作用,做无用功的同时让研发团队产生抱怨,因此SBOM应该是跟随代码、制品动态变化的「实时」数据。
可以通过将SBOM更新的逻辑嵌入到每一次代码的变更,例如通过IDE插件识别对应的代码变更、与代码仓库集成在代码提交或合并时重新生成;对于没有代码或者项目中存在二进制依赖的情况,CI/CD环节则更为关键,通过与jenkins等软件的集成可以实现代码发布前的审查。
## 通过知识库关联风险数据
SBOM只是一个开始,要想用于风险的治理,只有基线数据字段的SBOM难以发挥它的价值,背后需要有强大的知识库作为支撑。
SBOM要和知识库进行联动,当SBOM发生变化或者知识库中的数据发生变化时,都应该触发风险识别逻辑。例如,当SBOM中引入了一个新的组件,需要通过知识库评估这个组件是否存在开源许可证约束、是否适合商业使用;当出现一个新漏洞,知识库收录后应该联动SBOM判断有哪些项目受到影响。
## 构建管理平台
对于企业的内部治理而言,单点的工具是不够的,还需要有管理平台输出全局的风险视图,提供管理和控制能力。
例如,管理平台需要记录每一次的SBOM变化情况,从而能够展现不同时间点的风险指标情况;要能够基于项目、资产等不同维度对结果进行聚合,便于对总体风险进行梳理。
基本的管理平台可以如下图所示,以SBOM和知识库作为核心数据,控制模块通过和制品库、代码库等的联动,进行数据收集和策略下发,出现问题时帮助企业及时止损。决策模块对黑白名单进行维护、对阻断等策略进行管理,管理模块提供SBOM查询和相关管理指标看板的能力。
## 要求供应商提供SBOM
企业难以避免会使用到各类供应商提供的软件产品,这些产品通常以二进制的形式交付,相比源码识别的效果覆盖率会更低,存在的风险更难识别。此时SBOM应该作为供应商准入的要求,在采购环节要求提供SBOM,并对SBOM进行审查和统一管理。
## 总结
对于企业而言,SBOM是软件供应链治理中很重要的基础数据,能够帮助企业实现依赖治理、漏洞管理和开源许可证合规。SBOM背后靠的是SCA和知识库数据的支撑,想要充分发挥SBOM的作用,应该将生成工具和尽可能多的研发流程打通,做到实时更新,和全面的知识库数据进行动态关联,通过管理平台支撑全局的风险呈现与管理,同时还应要求供应商提供SBOM信息。
## 参考链接
[https://www.ntia.gov/SBOM](https://www.ntia.gov/SBOM)
[https://www.ntia.gov/blog/2021/ntia-releases-minimum-elements-software-bill-materials](https://www.ntia.gov/blog/2021/ntia-releases-minimum-elements-software-bill-materials)
[https://linuxfoundation.org/wp-content/uploads/LFResearch\_SBOM\_Report\_020422.pdf](https://linuxfoundation.org/wp-content/uploads/LFResearch_SBOM_Report_020422.pdf)
发布者:墨菲安全,转发请注明出处:https://www.murphysec.com/blog/knowledge-popularization/4218.html
@@ -0,0 +1,16 @@
---
page-title: "联想移动互联及数字家庭产品服务支持"
url: https://m.lenovocare.com.cn/ServiceStation.aspx
date: "2023-03-20 09:58:49"
---
联想移动客户服务中心(广州天河南二路店)
天河区天河南二路19号宏发大厦5楼539室(地铁三号线石牌桥a出口往东前行20米进楼巴候车室北门坐电梯5楼)
联系电话:020-85239885
营业时间:9:00-18:00
服务品牌:
lenovo moto zuk
@@ -0,0 +1,139 @@
---
page-title: "需要考虑的8种顶级SBOM工具 | CN-SEC 中文网"
url: https://cn-sec.com/archives/1247429.html
date: "2023-03-07 09:24:33"
---
写在前面:在[软件供应链](https://cn-sec.com/archives/tag/%e8%bd%af%e4%bb%b6%e4%be%9b%e5%ba%94%e9%93%be)攻击中,SBOM在监管要求和技术实现上,都是相对容易落地的方式。本文中介绍的SBOM程序,有的是耳熟能详,有的也是第一次看到。大家可以参考本文中推荐的软件,和现实工作相结合。
2022年7月25 
       要真正保证软件的安全,您需要知道代码里面有什么。这就是为什么软件物料清单(SBOM)在今天必不可少。过去,我们并不太担心代码的安全性。糟糕的二进制文件?好像是;源代码本身有问题?没那么严重。我们都太蠢了。
       随后,安全问题接踵而至:SolarWinds软件供应链攻击,Log4j漏洞持续存在,npm维护者抗议代码出错,这些都表明我们必须清理我们的软件供应链。对于专有软件来说,这是不可能的,因为它的创造者不会让你知道程序里面有什么。但对开源程序,这就可以通过软件物料清单(SBOM)实现,发音为“s-bomb”。
       事实上,SBOM不再仅仅是一个好主意;这是联邦政府的命令。根据乔·拜登总统于2021年7月12日发布的《关于提高国家网络安全的行政命令》,这是一项要求。该行政命令将SBOM定义为“包含构建软件中使用的各种组件的详细信息和供应链关系的正式记录”。对于开源软件来说,这是一个特别重要的问题,因为“软件开发者和供应商经常通过组装现有的开源和商业软件组件来创造产品。”
这是真的吗?噢,是的。我们都知道,开源软件无处不在,随处可见。但是你知道吗,据Tidelift统计,92%的应用程序包含开源组件。事实上,现代程序平均有70%是开源软件。
       显然,我们需要做些什么。根据Linux基金会、开源安全基金会(OpenSSF)和OpenChain的说法,答案是SBOM。Linux基金会研发副总裁Stephen Hendrick将SBOM定义为“正式的、机器可读的元数据,它唯一地标识一个软件包及其内容;它可能包括内容的其他信息,包括版权和许可数据。SBOM被设计为跨组织共享,特别有助于提高软件供应链参与者交付的组件的透明度。”
最佳SBOM实践
       SBOM应包括:
- 应用程序的开源库
- 程序的插件、扩展和其他附件
- 由开发人员内部编写的自定义源代码
- 这些组件的版本信息、软件许可状态和补丁状态
- 自动组件加密签名和验证
- 自动扫描生成SBOM,作为持续集成/持续部署(CI/CD)管道的一部分
       SBOM也应该使用一致的格式。当前最常见的SBOM格式包括软件包数据交换(SPDX)、软件标识(SWID)标签和OWASP CycloneDX。虽然这些都是标准,但2021年的行政命令并没有强制规定特定的SBOM格式。到目前为止,这三家公司都没有从其他公司中脱颖而出,形成事实上的行业标准。
       为了使SBOM更加实用,我们不仅要推动自动化创建SBOM,还要使其成为CI/CD管道的一部分。正如国家电信和信息管理局(NTIA)所言,最终目标是按照“机器速度”生成SBOM。
SBOM使用场景
SBOM有三个不同的使用场景:
1. 软件生产商使用SBOM来帮助构建和维护他们提供的软件。
2. 软件采购人员使用SBOM来告知购买前的保证,协商折扣,并计划实施策略。
3. 软件操作人员使用SBOM通知漏洞管理和资产管理,管理许可和合规,并快速识别软件和组件依赖关系和供应链风险。
       这之间区别很大。开发人员希望能有在他们的CI/CD管道上工作的工具,如CircleCI、Jenkins或Travis CI。运营人员或客户可能甚至不知道什么是CI/CD管道,但可能非常关心资产管理和安全补丁更新。
       Gartner估计,到2025年,60%的构建或采购关键基础设施软件的组织将强制执行SBOM并将其标准化。如今,这一比例不到20%。
顶级SBOM程序
       使用三种不同的SBOM格式和各种各样的元数据来跟踪一个SBOM,这并不奇怪,还没有超级的SBOM 程序,应该有一个,但现在还不存在。
       许多SBOM程序,但不是所有,和代码安全扫描器绑定在一起。其他的程序,是否你想要他们取决你的需要。Gartner推荐你的工具具有如下功能:
- 在构建过程中创建SBOM。
- 分析源代码和二进制文件(如容器镜像)。
- 为这些工件生成SBOM。
- 编辑SBOM。
- 以人类可读的格式查看、比较、导入和验证SBOM。
- 从一种格式或文件类型合并和转换SBOM内容到另一种格式或文件类型。
- 通过API和库支持在其他工具中使用SBOM操作。
       以下程序没有一个能实现所有这些建议。即使是这些项目中最成熟的Anchore、FOSSA和Rezillion,也还在发展中。
       我建议您尝试这些程序中的大部分(如果不是全部的话),看看哪一个最适合您和您的特定情况。然后给供应商和开发人员你的反馈。如果我们在2025年前做到这一点,我们可能会有一个针对所有不同用途的明确的最佳方案。
       以下是值得你关注的8个SBOM程序:
Anchore
       Anchore已经在SBOM行业工作了6年。它的基础是两个开源项目:Syft是一个命令行接口(CLI)工具和库,用于从容器镜像和文件系统生成SBOM;Grype是一个易于集成的容器镜像和文件系统漏洞扫描工具。
       您可以在开发过程的每个阶段,从源代码存储库和CI/CD管道到容器注册中心和运行时,使用它们一起生成SBOM。这些SBOM保存在一个集中存储库中,以实现完全的可见性和持续的监视,甚至在部署后也是如此。它支持CycloneDX, SPDX和Syft自己的SBOM格式。
       Anchor将其SBOM功能捆绑到Anchor Enterprise 4.0软件SCM(供应链管理)平台中。Anchore的目标是成为您一体化的软件供应链和SBOM安全公司。他们做得很棒。
FOSSA
       FOSSA的旗舰程序是一个开源许可证管理器和一个开源漏洞扫描器。仔细想想,SBOM非常自然地适合这些程序。
       在FOSSA的方法中,你可以将它的SBOM工具与你喜欢的版本控制系统集成,如GitHub、BitBucket或GitLab。或者您可以使用它的命令行并在本地运行它,或者将它集成为CI/CD管道的一部分。
       无论哪种方式,当您扫描您的项目时,FOSSA将自动识别目标代码库的直接依赖项和深度依赖项。这些深度嵌入的代码问题,比如对Log4j的间接依赖调用,可能隐藏在程序中,黑客仍然会利用它们进行破坏。
Mend
       Mend就是曾经的WhiteSource,它提供了各种软件成分分析(SCA)工具。SBOM被合并到其Mend SCA工具中。因此,Mend与其说是一个开发人员程序或CI/CD工具,不如说是程序员的开源许可和安全机制。
       因此,可以使用Mend跟踪每个组件,包括直接和传递性依赖、识别漏洞、提供修复路径,并在组件更改时自动更新SBOM记录。该公司声称其专利的可达性路径分析可以告诉您哪些漏洞可以被安全忽略,因为您的应用程序没有使用这些库,或者这些库的使用方式没有暴露这些漏洞。
Rezilion
       DevSecOps公司Rezilion将SBOM作为其整体软件安全和漏洞系统的一部分。它的动态SBOM使用动态运行时分析来跟踪代码更改时的软件攻击面。因此,它会不断查找代码组件的已知弱点。换句话说,这是跟踪和保护代码的二合一方法。
       除了提供CI/CD、staging和生产环境中所有软件组件的实时清单外,它还会不断更新您的SBOM。您可以导出您的SBOM的CycloneDX和Excel电子格式。
SPDX SBOM Generator
       SPDX SBOM Generator是一个独立的开源工具,顾名思义:它从当前的包管理器或构建系统创建SPDX SBOM。您可以使用它的命令行从代码生成SBOM数据。它报告代码的组件、许可、版权和安全引用。该数据在SPDX v2.2规范中导出。如果你只需要基础信息,它会很适合你。
Tern Project
       另一个开源SBOM项目,Tern可能与SPDX SBOM Generator很好地配合。不使用包管理器或构建系统,这个SCA工具和Python库为容器镜像和Dockerfiles生成一个SBOM。它还生成SPDX格式的SBOM。
TauruSeer
       这个SBOM程序是以软件即服务(SaaS)的形式提供的。凭借以应用为中心的专利集成方法,Tauruser将认知引擎安全扫描与SBOM相结合。该包将帮助您为开发人员和客户保护和跟踪您的代码。
Vigilant Ops
       Vigilant Ops是一家医疗设备网络安全公司,其InSightPlatform已将注意力转向SBOM。它的SaaS平台产生、维护、验证共享的认证SBOM。它通过持续的漏洞监视和警报集成了安全性。其SBOM认证采用专利算法,确保所有组件都经过验证,漏洞都有对应链接。
       它的安全特性还可以用于其他程序生成的SBOM,它们在静止和传输过程中都被加密。
https://www.csoonline.com/article/3667483/8-top-sbom-tools-to-consider.html
(完)
> 原文始发于微信公众号(安全行者老霍):[需要考虑的8种顶级SBOM工具](http://mp.weixin.qq.com/s?__biz=Mzg3NjU4MDI4NQ==&mid=2247485274&idx=1&sn=f2a88efe23d60e9b22fa13b25663859f&chksm=cf315b88f846d29e713f4dc5cf4806184e3dd4de8268b586b4df42b6e6b3057ba5cf6eba2642&scene=126&sessionid=1661129128&key=42fda77b115ac87d8e8f45476ebf6fc3853c4ca79e53943c9bb46957f197f30e323f4524f5e1024d6caf03fc6e53a7c8ffd6a3e44a7f9d8a9f3c5d86518e202273511a2bd9a3f2f527672e88c0950fd53a2c1f5937d043e9cfd126d131c69708b4962163ce84361c3a97232fe0d2249b9cab1d632372630108f775f16b6e7b72&ascene=15&uin=NTY2NTA4NjQ%3D&devicetype=Windows+10+x64&version=6307051f&lang=zh_CN&session_us=gh_c2b78e839fd7&exportkey=AwGngfClmceA4%2BIRnQr6V0g%3D&acctmode=0&pass_ticket=uyfgm43O%2Bnte37Omf7S0pmG8umA%2F6CVPJp%2FegyZGM04etQwzjCVeYLTpeBxJ%2BLOq&wx_header=0&fontgear=2)
特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
点赞
https://cn-sec.com/archives/1247429.html 复制链接 复制链接