IOT 終端裝置如何安全地往 S3 傳輸檔案
前序
物聯網裝置通常使用 X.509 證書通過 Mqtt協議連線到 AWS IOT平臺,通過Pub/Sub的方式進行互動。隨著硬體裝置的功能愈加強大,更多非控制的資料需要與雲端進行互動。例如需要把更新包/外掛從S3下載到硬體端,或者把視訊資料從IP Camera傳輸到S3進行儲存,這些場景下終端裝置需要跟S3進行互動。與Mqtt使用X.509證書進行身份認證不同,S3(包括其他的AWS服務)使用Signature Version 4,也就是Access Key和Secret Access Key的方式進行身份認證(具體的簽名過程已經在AWSCLI和SDK底層封裝實現,只需要提供Access Key和Secret Access Key即可)。基於安全的考慮,AWS建議通過STS服務向用戶群體頒發臨時憑證(包含Access Key、Secret Access Key和Session Token),在短時間內向合法使用者授予細粒度的許可權,從而保證授權處在可控的範圍。為了保證使用者的合法性,我們往往需要通過登陸等邏輯模組進行身份驗證,通過驗證後再向使用者頒發臨時憑證,這個流程大概如下圖所示:
上述方案看起來不錯,提供足夠的安全性。但在物聯網場景中,終端裝置往往是百萬級別甚至是千萬級別的,客戶需要搭建叢集支援登陸模組龐大的訪問量。既然AWS把IOT打包成一個託管服務,那AWS能否把認證和分發臨時憑證新增到IOT功能模組中呢?
答案是肯定的,這也是本文將要介紹的功能。在物聯網場景中一個天然的優勢是,大部分的硬體裝置在出廠時內嵌了X.509證書,X.509證書在很大程度上能夠作為合法憑證。AWS IOT最新推出的特性,能夠複用這套身份檢驗方式,客戶不再需要搭建登陸等元件進行合法性認證,就能夠獲取臨時憑證。具體做法是裝置端發起一個Https連線請求臨時憑證,把X.509證書作為Https建立SSL通道的客戶端證書來做身份驗證,具體流程如下圖所示。除了S3外,IOT終端裝置也可以通過這種方法獲取其他基於Signature Version 4的AWS服務的許可權。本文將會對這項功能特性的配置流程進行介紹。
概述
如下圖所示,配置這項功能需要以下四個步驟:
(1) 步驟一:配置終端裝置獲取臨時憑證的連線。在終端裝置上配置必要的證書和證書鏈,並通過CLI工具得到當前AWS賬戶獲取臨時憑證的終端節點。
(2) 步驟二:定義臨時憑證的許可權。在IAM Role配置信任關係,並賦予相應訪問許可權。
(3) 步驟三:實現AWS IOT元件與IAM Role的關聯。
(4) 步驟四:進一步精細化許可權控制。
設定步驟
一.裝置端的準備工作
裝置通過Https在AWS IOT的443埠上獲取臨時憑證。在建立Https時,您需要把以下證書載入到裝置端:
(1)X.509證書以及私鑰。這兩個是Mqtt建立通訊時的客戶端證書檔案。如果之前通過IOT Mqtt建立通訊,這兩個檔案已經存在於裝置端。
(2)RSA Amazon Root CA 1和 VeriSign Class 3 Public Primary G5 根 CA 證書。這兩個檔案是建立https時,AWS端的證書鏈檔案。為了防止裝置端環境不信任AWS的證書鏈造成SSL通道建立不成功,需要把這兩個檔案放置在裝置端。
(3)查詢AWS Account獲取臨時憑證的終端節點。需要注意的是,該終端節點不同於IOT終端節點,且暫時不支援通過AWS控制檯進行獲取。我們可以通過AWSCLI工具的describe-endpoint CLI命令進行獲取,命令如下:
aws iot describe-endpoint –endpoint-type iot:CredentialProvider —region ap-southeast-1
需要注意的是,必須指定引數 endpoint-type 為 iot:CredentialProvider ,否則無法獲取臨時憑證的endpoint。
返回的endpoint格式如下所示:
<your-iot-credentialprovider-id>.credentials.iot.<region>.amazonaws.com
最終訪問的URL為:
https://<your-iot-credentialprovider-id>.credentials.iot.<region>.amazonaws.com:443/role-aliases/<your-role-alias>/credentials
二.AWS IAM Service的準備工作
裝置端獲取的臨時憑證的許可權在IAM Role中定義,我們需要建立一個新的IAM Role,並把裝置端需要獲取的許可權(例如從S3下載檔案)賦予該角色。這部分的工作有兩點需要注意:
(1)建立完IAM Role後,需要把該IAM Role的信任關係編輯修改為以下內容:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "credentials.iot.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
可以注意到,上述信任關係與直接把IOT服務作為受信任實體有所不同。當前無法在控制檯直接選擇 credentials.iot 作為受信任實體,所以需要在建立IAM Role後把信任關係修改為上述內容。該信任關係表明:信任實體credentials.iot可以切換到該IAM Role,獲取該IAM Role所擁有的許可權。
(2)把裝置端需要獲取的許可權策略Policy附加給IAM Role。例如:如果您希望裝置端能夠對vincent-iot這個S3 Bucket下的檔案進行操作,IAM Policy的內容如下所示:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets",
"s3:HeadBucket",
"s3:ListObjects"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "arn:aws:s3:::vincent-iot/*"
}
]
}
您可能注意到,上述IAM Policy的許可權對於每個裝置提供的許可權是一樣的,許可權粒度不夠精細。如果希望對每個裝置端的許可權進行更細粒度的控制,例如每個裝置只能訪問其在S3某一個目錄下的檔案,可以在上述Policy中通過新增IOT策略變數來實現。具體我們會在第四部分加以詳述。
三.AWS IOT Service的準備工作
Https獲取臨時憑證的過程中,AWS通過X.509證書來做身份識別。每個X.509證書對應AWS IOT平臺的一個Credential。要完成Credential跟IAM Role的關聯,需要做以下兩步關鍵操作:
(1)建立角色別名。角色別名是AWS IOT新增加的一個元件,用於把IAM Role對映到AWS IOT元件。我們可以在AWS IOT控制檯建立一個角色別名,在角色別名中指定第二部分中建立的IAM Role作為目標,如下圖所示:
(my_iot_role_alias為角色別名;my-iot-role為第二部分IAM Role的名稱)
我們留意到,請求臨時憑證的URL的相對路徑中,包含了角色別名<your-role-alias>。因此可以看到,IAM Role的ARN並沒有硬編碼到URL中。當需要修改IAM Role時,我們只需要在角色別名中修改其所指向的IAM Role ARN即可,無需修改裝置端的URL。角色別名起到解耦的作用。
另外需要注意的是,臨時憑證的有效期是在建立角色別名時設定的,預設為900秒。AWS控制檯暫時不提供有效期的選項,但我們可以在AWSCLI建立角色別名時通過引數credentialDurationInSeconds進行指定,如下所示:
aws iot create-role-alias –role-alias my_iot_role_alias –role-arn arn:aws:iam::123456789012:role/my-iot-role –credential-duration-seconds 3600 –region ap-southeast-1
(2)在每個裝置Credential attach的IOT Policy中增加iot:AssumeRoleWithCertificate許可權,使裝置擁有代入角色別名的許可權。IOT Policy的內容如下所示:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "iot:AssumeRoleWithCertificate",
"Resource": "arn:aws:iot:ap-southeast-1:123456789012:rolealias/my_iot_role_alias"
}
]
}
(您需要把上述Resource中的ARN替換成您角色別名的ARN)
經過上述的設定,終端裝置就能通過Https獲取臨時憑證。我們用以下wget命令發起訪問,會獲得臨時憑證的返回:
wget –private-key=/home/ubuntu/iotgetaksk/2ffd3c6424-private.pem.key –certificate=/home/ubuntu/iotgetaksk/2ffd3c6424-certificate.pem.crt –ca-directory=/home/ubuntu/iotgetaksk/AmazonRootCA1.cer –debug https://abcdefghijklm.credentials.iot.ap-southeast-1.amazonaws.com:443/role-aliases/my_iot_role_alias/credentials
四.許可權的細粒度考慮
在第二部分中,我們提到該IAM Policy給每個裝置提供相同許可權,存在一定的安全隱患。我們能夠在IAM Policy中嵌入IOT策略變數為每個裝置提供更細粒度的許可權,例如我們可以把第二部分的IAM Policy改為如下:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets",
"s3:HeadBucket",
"s3:ListObjects"
],
"Resource": "*"
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": "s3:*",
"Resource": "arn:aws:s3:::vincent-iot/${ iot:certificateId}/*"
}
]
}
在上述IAM Policy中,我們以${ iot:certificateId}策略變數作為S3 Resource的一部分。當請求臨時憑證時,AWS會使用實際值替換該變數,從而做到每個臨時憑證精細化許可權控制。
這個特性當前支援三種策略變數,分別:
· ${iot:thingName} 事物名稱
· ${iot:thingType} 事物型別
· ${iot:certificateId} X.509證書ID
其中${iot:certificateId}會自動跟當前的X.509證書相匹配,但${iot:thingName}和${iot:thingType}與前者稍有不同:
(1)如果在IAM Policy中使用了${iot: thingName}或者${iot:thingType},我們必須在Https的request Header中新增x-amzn-iot-thingname請求標頭來傳遞事物名稱thing name,否則無法在IAM Policy中使用事物變數${iot:thingName}和${iot:thingType}。採用這種操作是因為當前一個X.509證書能夠附加多個thing,因此我們必須在Https請求標頭中指定具體的thing name,AWS才能獲取具體對應的${iot:thingName}和${iot:thingType}。這也說明了,當前通過X.509證書獲取臨時憑證這種做法,一個臨時憑證只能精細化控制對某一個thing的許可權分發。
(2)如果在IAM Policy中指定了${iot:thingName}或者${iot:thingType},但在Https Request中沒有新增x-amzn-iot-thingname標頭,AWS會正常給您返回臨時憑證,但我們會發現該臨時憑證沒有任何許可權。
(3)當在Https Request中新增x-amzn-iot-thingname標頭後,AWS會檢查當前的X.509證書是否已經附加相應的thing。如果發現附加關係不正確,AWS會拒絕返回臨時憑證,返回403,提示“Invalid thing name passed”。
當您一切準備就緒後,您可以嘗試通過以下wget命令發起訪問:
wget –header=”x-amzn-iot-thingname: bulbthing” –private-key=/home/ubuntu/iotgetaksk/2ffd3c6424-private.pem.key –certificate=/home/ubuntu/iotgetaksk/2ffd3c6424-certificate.pem.crt –ca-directory=/home/ubuntu/iotgetaksk/AmazonRootCA1.cer –debug https://abcdefghijklm.credentials.iot.ap-southeast-1.amazonaws.com:443/role-aliases/my_iot_role_alias/credentials
再次提醒,只有在IAM Policy中使用了${iot:thingName}或者${iot:thingType}策略變數才需要在Https請求中新增x-amzn-iot-thingname請求標頭,對於${iot:certificateId}是不需要的。
結束語
Mqtt與其他AWS服務的身份認證方式存在差異。為了減少與兩套體系互動時重複的身份認證工作,AWS推出本文介紹的功能,複用X.509證書,減少客戶的開發量和成本。目前,該功能在AWS海外具有IOT服務的區域可用,但在由光環新網運營的北京區域暫時不可用。
相關推薦
IOT 終端裝置如何安全地往 S3 傳輸檔案
前序 物聯網裝置通常使用 X.509 證書通過 Mqtt協議連線到 AWS IOT平臺,通過Pub/Sub的方式進行互動。隨著硬體裝置的功能愈加強大,更多非控制的資料需要與雲端進行互動。例如需要把更新包/外掛從S3下載到硬體端,或者把視訊資料從IP Camera傳輸到S3進行
Windows系統往伺服器傳輸檔案
現在做深度學習方向的越來越多,好多實驗室配備了伺服器,ubuntu下可以使用scp命令往伺服器上傳檔案,但是Windows就尷尬了。 Windows下可以安裝一個小軟體,特別好用,推薦給大家。 安裝BvSshClient,安裝包BvSshClient-Inst.exe,預
使用 SFTP 安全地傳輸檔案---轉載
什麼是 SFTP ? 在瞭解 SFTP 之前,我們先看看什麼是 FTP 。FTP( File Transfer Protocol )檔案傳輸協議,是一種常用來在兩終端系統之間傳輸檔案的方法。 SFTP ,即 SSH 檔案傳輸協議( SSH File Transfer Protocol )
從Windows用scp往linux裡傳輸檔案
有時候會需要從windows往linux伺服器copy檔案,直接copy的話會比較麻煩,可以用scp進行傳輸。 因為windows系統本身不支援ssh協議,所以,要想上面的命令成功執行,必須在windows客戶端安裝ssh for windows的客戶端軟體,
App與終端裝置通訊經驗五(流媒體傳輸對碼流的解析)
模組一(為什麼使用RTP協議): 一提到流媒體傳輸、一談到什麼視訊監控、視訊會議、語音電話(VOIP),都離不開RTP協議的應用,但當大家都根據經驗或者別人的應用而選擇RTP協議的時候,你可曾想過,為什麼我們要使用RTP來進行流媒體的傳輸呢?為什麼我們一定要用R
adb 命令匯入PC端資料夾到終端裝置指定路徑
ADB命令匯入資料夾到終端裝置方法: 假設匯入桌面的一個AIP檔案,具體路徑:C:\Users\zhangyao\Desktop\AIP 目的路徑:/mnt/sdcard/PDMTest 方法1:adb push PC端資料夾路徑 [空格] 目的外設路徑 例項: adb push C:\
Linux中歸檔檔案並在系統間傳輸檔案
檔案歸檔tar tar命令能夠列出存檔內容,或者將其檔案提取到當前系統。通過tar,使用者可以將大型檔案集彙集為一個檔案(存檔),該存檔可用gzip,bzip2,xz壓縮方式壓縮 使用歸檔檔案和目錄tar 在建立tar存檔之前,先驗證目錄中沒有其他存檔與要建立的新存檔名稱相同,tar命令
linux與windows傳輸檔案
一、使用 Xshell 工具 1. Xshell 的設定如下圖: 2. 設定 windows 共享路徑,和 linux 路徑(~ 代表跟路徑) 3. 新建檔案傳輸,點選取消或關閉 4.
使用SecoureCRT的rz和sz命令傳輸檔案
首先,使用SecoureCRT工具連線上你的虛擬機器 輸入:rz或者sz會提示你沒有安裝lxrz 根據提示所寫進行安裝(注意如果你是Ubuntu7.1則裝不上,需要使用我前面文章所講的sftp進行檔案的傳輸) 命令如下: sudo install lxrz (根據
【JS API】指令碼語言-裝置控制介面說明-下載檔案
裝置控制介面說明-下載檔案 download 原型: download(from, to, timeOut) 是否支援多裝置: 支援 描述: 下載指定檔案到指定目錄中,從手機中下載檔案到電腦中。 引數: from : 字串,源端檔案路徑,即需要下載的檔案。 to
【JS API】指令碼語言-裝置控制介面說明-判斷檔案或資料夾是否存在
裝置控制介面說明-判斷檔案或資料夾是否存在 doesExist 原型: doesExist(filePath) 是否支援多裝置: 不支援 描述: 判斷指定的檔案或資料夾是否存在。 引數: filePath: 手機上檔案或資料夾路徑 返回值: 整型:檔案或資
網路傳輸檔案 -- 迴圈傳送檔案
fread FILE *fopen(const char *path, const char *mode); size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); size_t fwrite(const void *
網路傳輸檔案 -- 一次性得到檔案大小
client.c #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <netinet/in.h> #include <arpa/inet.h&
ajxa非同步傳輸檔案
<form id="form1"> <input type="file" name="file" /> </form> &n
如何使用FTP傳輸檔案到網站
對於用於伺服器的人來說,如需上傳檔案到其伺服器,選擇使用FTP方式是一個不錯的選擇,那麼如何使用FTP方式傳輸檔案到伺服器呢?我將以我使用FTP的經驗,為大家講解如何使用FTP將您的檔案傳輸到您的伺服器上。 首先,通過百度等方式搜尋FTP軟體。我使用的是8UFTP。那麼,我將以這款軟體的操作方法
crontab新增系統定時任務--資料庫定時備份指令碼&傳輸檔案到阿里雲伺服器定時指令碼
前言 由於公司網站被黑客攻擊,導致部分資料丟失,需要使用0.6個比特幣贖回,因為建立資料安全對策,提高網站和資料安全級別,同時進行資料定時備份,並將資料傳輸阿里雲伺服器存放,特此記錄。 1,A,B伺服器之間建立信任 https:
【Linux C/C++】 第08講 多執行緒TCP傳輸檔案/select模型
一、多執行緒 pthread.h libpthread.so -lpthread 1.建立多執行緒 1.1 程式碼 &nbs
Java Socket實戰之七 使用Socket通訊傳輸檔案
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
利用Xshell從Windows到Linux上傳輸檔案
1.在Ubuntu上安裝lrzsz: sudo apt-get install lrzsz; 2.使用Xshell登陸系統; 3.在Xshell中輸入命令 rz,彈出對話方塊選擇要傳輸的檔案即可(從windows傳輸到Linux) 在Xshell中輸入命令 sz
Linux遠端傳輸檔案的簡單方式
介紹Linux下兩個簡單且安全的檔案傳輸方式: 一、scp,secure copy的縮寫,可以用來遠端傳輸拷貝的檔案,並且比較安全(ssh:22) 注意:遠端主機ip的存放目錄用分號:隔開 1、拷貝檔案 scp /home/root/1.txt [email prote