日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

贫苦云主机用户的安全加固策略

發布時間:2023/12/18 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 贫苦云主机用户的安全加固策略 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


上次去北京出差,為了便捷地訪問家里內網中的一些服務,就在騰訊云服務器上部署了一個 frps 服務,在本地內網的 Openwrt 路由器上安裝 frpc 客戶端,將內網中的一臺 Windows 服務器穿透到騰訊云服務器上。然后通過 Windows RDP 遠程連接到這臺 Windows 機器上,來使用內網的一些服務。之前也嘗試過 WireGuard,但是使用了一段時間體驗下來感覺還是通過內網穿透的方式比較穩定和流暢。于是最終的方式還是選用 frp 內網穿透的方案。

本著方便省事兒的原則就放心大膽地開放了云服務器的安全組規則。不幸的是,由于這樣的疏忽,某一天我的 Windows 虛擬機被弱口令(admin2020)給爆破了。巨大的損失就是掛載到 Windows 虛擬機上的 NAS 存儲被勒索病毒進行了加密 😂。不過好在最最重要的數據全部存到了 OneDrive 上,NAS 上損失的都是一些下載的電影、書籍以及一些 ISO、虛擬機模版之類的文件。一下子損失了 8TB 的數據很心疼,畢竟是自己辛辛苦苦搜集的資源,但是仔細想一下,這些資源都不是自己的,基本上都是從下載下來的,還可以通過同樣的方式找回來。或許是之前看過《斷舍離》的緣故,也看的開了,難受了一小會兒之后就好過來了。畢竟這個世界上,沒有無法不能失去的東西,也沒有非得必須要得到的東西。

有了此次教訓,就開始考慮對手上的云主機資源進行安全加固,將一些與內網互通的云主機安全組/防火墻的通用去除了允許所有,只添加本地公網 IP 的允許規則。但是對于家庭寬帶用戶來講,公網 IP 并不是一個固定的 IP,而是會一直不斷變化,總不能每次變化之后再登錄到云主機控制臺手動添加一下吧。于是就想著有沒有自動化的方式來自動添加和更新安全組/防火墻規則呢?

Terraform

第一個想到的方案便是 terraform,主流的云廠商都有對應的 provider 支持,騰訊云應該也是能夠支持的。不過看了官方的 terraform-provider-tencentcloud[1] repo 文檔之后,并沒有找到給 lighthouse 主機配置防火墻規則的支持,遂放棄。

cfwctl

既然 terraform 不支持,那就自己造輪子寫一個吧,就叫它 Cloud Firewall Control Tool,簡稱 cfwctl[2]。騰訊云官方的 API 文檔還可以,還能在線生成代碼,用起來也十分方便。考慮到會將該工具運行到運行到 arm64 的路由器上,因此跨平臺運行 cfwctl 使用 golang 來實現無疑是個不錯的選擇,正好也能來練練手。

執行的操作其實很簡單,先是通過某種方式獲取本地機器的公網 IP,然后將該 IP 添加到對應實例的防火墻規則當中,并在規則描述中添加標識符來標記。目前自己只需要添加規則,先湊活著用一段時間,看下效果如何。目前只支持騰訊云的 lighthouse 實例,后續有機會再增加幾個別的云廠商支持。

獲取公網 IP

首先要獲取到我們本地網路的公網 IP,由于公網 IP 可能一直是變化的,所以我們每次更新防火墻規則之前都需要獲取最新的公網 IP。以下是具體實現的代碼:

package?mainimport?("fmt""io/ioutil""net/http""regexp" )//?定義?IPv4?的正則表達式,目的是從獲取公網?IP?的??API?返回結果中過濾出?IPv4?地址 const?ipv4_regex?=?`(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}`//?定義幾個幾個提供獲取公網?IPv4?地址的?API?URL var?urlList?=?[]string{"https://ip.me""http://ip.sb","http://ip.cip.cc","http://myip.ipip.net", }func?GetPublicIP()?string?{for?_,?url?:=?range?urlList?{//?創建一個?http?clientclient?:=?&http.Client{}//?設置?client?的請求方法為?GET?以及請求的?URLrequest,?err?:=?http.NewRequest("GET",?url,?nil)if?err?!=?nil?{continue}//?設置?Client?的?User-Agent?為?curl,不然一些?API?會返回?html?的結果request.Header.Set("User-Agent",?"curl/7.54.0")resp,?err?:=?client.Do(request)if?resp.StatusCode?!=?200?&&?err?!=?nil?{continue}defer?resp.Body.Close()body,?err?:=?ioutil.ReadAll(resp.Body)//?從?API?返回結果中用正則匹配出?IPv4?地址reg?:=?regexp.MustCompile(ipv4_regex)ipList?:=?reg.FindAllString(string(body),?-1)//?如果匹配結果中有?IPv4?地址,則返回第一個元素即可if?len(ipList)?>?0?{fmt.Printf("my?public?ip?is?%s\n",?ipList[0])return?ipList[0]}}return?"" }

添加 Firewall 規則

package?mainimport?("fmt""os""github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common""github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors""github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/profile"lighthouse?"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/lighthouse/v20200324" )//?定義?API?請求的?URL const?endpoint?=?"lighthouse.tencentcloudapi.com"//?定義請求?API?的?Client?結構體 type?Client?struct?{SecretId??stringSecretKey?stringInstaceId?stringRegion????stringEndpoint??string }//?通過該方法從環境變量中讀取?Ck?Sk?等信息,并返回一個?client?對象 func?NewClient()?Client?{client?:=?Client{SecretId:??os.Getenv("TENCENTCLOUD_SECRET_ID"),SecretKey:?os.Getenv("TENCENTCLOUD_SECRET_KEY"),InstaceId:?os.Getenv("TENCENTCLOUD_INSTANCE_ID"),Region:????os.Getenv("TENCENTCLOUD_REGION"),Endpoint:??endpoint,}if?client.SecretId?==?""?||?client.SecretKey?==?""?||?client.InstaceId?==?""?||?client.Region?==?""?{panic("Please?set?TENCENTCLOUD_SECRET_ID,?TENCENTCLOUD_SECRET_KEY,?TENCENTCLOUD_INSTANCE_ID,?TENCENTCLOUD_REGION")}return?client }//?定義添加防火墻規則的方法 func?(c?Client)?AddRules(firewallRules?[]*lighthouse.FirewallRule)?{credential?:=?common.NewCredential(c.SecretId,?c.SecretKey)cpf?:=?profile.NewClientProfile()cpf.HttpProfile.Endpoint?=?endpointclient,?_?:=?lighthouse.NewClient(credential,?c.Region,?cpf)request?:=?lighthouse.NewCreateFirewallRulesRequest()request.InstanceId?=?common.StringPtr(c.InstaceId)request.FirewallRules?=?firewallRulesresponse,?err?:=?client.CreateFirewallRules(request)if?_,?ok?:=?err.(*errors.TencentCloudSDKError);?ok?{fmt.Printf("An?API?error?has?returned:?%s",?err)return}if?err?!=?nil?{panic(err)}fmt.Printf("%s",?response.ToJsonString()) }

獲取防火墻規則

func?(c?Client)?GetRules()?string?{credential?:=?common.NewCredential(c.SecretId,?c.SecretKey)cpf?:=?profile.NewClientProfile()cpf.HttpProfile.Endpoint?=?endpointclient,?_?:=?lighthouse.NewClient(credential,?c.Region,?cpf)request?:=?lighthouse.NewDescribeFirewallRulesRequest()request.InstanceId?=?common.StringPtr(c.InstaceId)response,?err?:=?client.DescribeFirewallRules(request)if?_,?ok?:=?err.(*errors.TencentCloudSDKError);?ok?{fmt.Printf("An?API?error?has?returned:?%s",?err)return?""}if?err?!=?nil?{panic(err)}return?response.ToJsonString() }

使用

  • 在本地的 ~/.bashrc 或者 ~/.zshrc文件中設置一些 AKSK 信息、實例 ID、region 信息等參數;

export?TENCENTCLOUD_SECRET_ID="AKiiiplQntjJbcMp1" export?TENCENTCLOUD_SECRET_KEY="SKkkkiiwwlwjmmG5" export?TENCENTCLOUD_INSTANCE_ID="lhins-qjxazjaa" export?TENCENTCLOUD_REGION="ap-beijing"
  • 設置好環境變量之后,再編譯運行看下能否成功

$?go?build?-o?cfwctl $?chmod?+x?cfwctl $?cfwctl?addmy?public?ip?is?193.191.231.82 {"Response":{"RequestId":"30e71243-1793-112e-9e41-b310ec599b90"}}%
  • 如果是 arm64 的 OpenWrt 環境,在本地開發機上進行跨平臺編譯,然后將編譯好的 cfwctl 二進制文件 scp 到路由器上,再添加 cron job 定時任務即可,這樣就能自動定時更新防火墻規則來。

$?CGO_ENABLED=0??GOOS=linux??GOARCH=arm64?go?build?-o?cfwctl

引用鏈接

[1]

terraform-provider-tencentcloud: https://github.com/tencentcloudstack/terraform-provider-tencentcloud

[2]

cfwctl: https://github.com/muzi502/cfwctl

原文鏈接:https://blog.k8s.li/cfwctl.html


你可能還喜歡

點擊下方圖片即可閱讀

我媽今年 70 歲,她用了 21 年的 Linux!

云原生是一種信仰?🤘

關注公眾號

后臺回復?k8s?獲取史上最方便快捷的 Kubernetes 高可用部署工具,只需一條命令,連 ssh 都不需要!

點擊?"閱讀原文"?獲取更好的閱讀體驗!

發現朋友圈變“安靜”了嗎?

總結

以上是生活随笔為你收集整理的贫苦云主机用户的安全加固策略的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。