1. 程式人生 > >IOT 終端裝置如何安全地往 S3 傳輸檔案

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用scplinux裡傳輸檔案

有時候會需要從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