

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 設定 SharePoint 的 Microsoft Entra ID 僅限應用程式身分驗證
<a name="kb-managed-sharepoint-entra-setup"></a>

Microsoft Entra ID 僅限應用程式身分驗證 (`ENTRA_ID_APP_ONLY`) 是 SharePoint 資料來源的建議身分驗證方法。它使用 OAuth 2.0 client-credentials （僅限應用程式） 流程：Microsoft Entra 應用程式使用憑證進行驗證，因此在網路爬取時間或查詢時間不會涉及使用者登入。這是唯一支援文件層級存取控制 (ACLs身分驗證方法。如需與替代`OAUTH2_APP`方法的比較，請參閱 [身分驗證方法](kb-managed-ds-sharepoint.md#kb-managed-sharepoint-auth-methods)。

此設定跨越兩個系統：Microsoft Entra ID 和 AWS 您的帳戶，而憑證是將這些系統連結在一起的憑證。連接器會將憑證 （包含私有金鑰） 儲存為 Amazon S3 中的 PKCS\#12 (`.p12`) 檔案，並使用它來簽署身分驗證聲明給 Microsoft；相符的公有憑證會上傳至 Entra 應用程式註冊，以便 Microsoft 驗證這些聲明。

**需要管理存取權**  
此設定需要 Microsoft Entra ID 管理員 （全球管理員或特殊權限角色管理員） 來註冊應用程式、設定許可，以及授予管理員同意。如果您使用`Sites.Selected`許可範圍，您也需要 SharePoint 管理員來授予每個站台的存取權。下面的**設定步驟和角色**資料表會識別每個步驟所需的存取權。

## 設定步驟和角色
<a name="kb-managed-sharepoint-entra-roles"></a>

此程序同時涉及 Microsoft Entra ID 管理員和 AWS 管理員。視責任在組織中的分配方式而定，可能會有一個人或多人完成這些步驟。使用下表來識別每個步驟所需的存取權。


**設定步驟和每個步驟都需要的存取權**  

| 步驟 | 您執行的動作 | 需要存取 | 
| --- | --- | --- | 
| 1. 註冊應用程式 | 建立 Entra 應用程式註冊並記錄其用戶端和租用戶 IDs。 | Microsoft Entra ID 管理員 （全球管理員或特殊權限角色管理員） | 
| 2. 新增許可並授予同意 | 為您的組態指派應用程式許可，並授予管理員同意。 | Microsoft Entra ID 管理員 | 
| 3. 產生憑證 | 使用 OpenSSL 建立自我簽署憑證和 PKCS\#12 (.p12) 套件。 | 具有本機終端機的任何人 （需要 OpenSSL) | 
| 4. 將公有憑證上傳至 Entra | 將公有憑證新增至應用程式註冊的金鑰。 | Microsoft Entra ID 管理員 | 
| 5. 授予每個站台存取權 (Sites.Selected僅限 ) | 透過 Microsoft Graph API 授予應用程式存取每個 SharePoint 網站的權限。 | Microsoft Entra ID 管理員 | 
| 6. 將憑證上傳至 Amazon S3 | 將.p12套件存放在 Amazon S3 儲存貯體中。 | AWS 管理員 (Amazon S3) | 
| 7. 建立秘密 | 將登入資料存放在 AWS Secrets Manager 秘密中。 | AWS 管理員 (Secrets Manager) | 
| 8. 授予服務角色對憑證的存取權 | 將 Amazon S3 讀取許可新增至您的知識庫服務角色。 | AWS 管理員 (IAM) | 

## 選擇您的組態
<a name="kb-managed-sharepoint-entra-choose"></a>

開始之前，請做出兩個決策。它們決定您在步驟 2 中指派的許可，以及如何授予網站存取權。
+ **文件層級存取控制 (ACLs)** — 決定資料來源是否依每個使用者的 SharePoint 許可篩選查詢結果。ACL 爬取需要額外的 Microsoft Graph 和 SharePoint 許可。您無法在建立資料來源後變更此設定。如需詳細資訊，請參閱[文件層級存取控制](kb-managed-ds-sharepoint-acl.md)。
+ **許可範圍** — 決定應用程式是否可以讀取租用戶中的所有 SharePoint 網站 (**所有網站**，最簡單的選項） 或僅您明確授予的網站 (**`Sites.Selected`**最低權限選項）。透過`Sites.Selected`您在步驟 5 中完成每個網站的額外授予，之後新增的任何網站都需要自己的授予。

這兩個選項的組合會在下一節中選取其中一個許可集。

## 許可參考
<a name="kb-managed-sharepoint-entra-permissions"></a>

指派符合您組態的應用程式許可。所有許可都是**應用程式**許可 （未委派），而且每個許可都需要管理員同意。連接器會驗證兩個 Microsoft 資源：**Microsoft Graph** （列舉網站，以及針對 ACLs 解析使用者和群組） 和 **SharePoint** REST API （讀取網站內容，以及針對 ACLs 的項目層級許可）。

**重要**  
當您在 Entra 入口網站中新增這些許可時，請選擇**應用程式許可**索引標籤，而非**委派許可**。僅應用程式身分驗證使用應用程式許可。

選取組態的索引標籤，以查看要指派的確切 Microsoft Graph 和 SharePoint 許可。

------
#### [ All sites, no ACLs ]


**所有網站，僅限內容**  

| API | 權限 | 用途 | 
| --- | --- | --- | 
| Microsoft Graph | Sites.Read.All | 列舉和讀取所有 SharePoint 網站。 | 
| SharePoint | Sites.Read.All | 透過 SharePoint REST API 讀取網站內容。 | 

------
#### [ All sites, with ACLs ]


**具有 ACLs 的所有網站**  

| API | 權限 | 用途 | 
| --- | --- | --- | 
| Microsoft Graph | Sites.Read.All | 列舉和讀取所有 SharePoint 網站。 | 
| Microsoft Graph | User.Read.All | 解決文件層級 ACLs的使用者。 | 
| Microsoft Graph | GroupMember.Read.All | 解決文件層級 ACLs群組成員資格。 | 
| SharePoint | Sites.FullControl.All | 讀取 ACL 爬取的項目層級許可，並在查詢時驗證存取權。 Sites.Read.All 不足以進行此檢查。 | 

------
#### [ Sites.Selected, no ACLs ]


**Sites.Selected，僅限內容**  

| API | 權限 | 用途 | 
| --- | --- | --- | 
| Microsoft Graph | Sites.Selected | 僅存取您明確授予的網站 (Microsoft Graph)。 | 
| SharePoint | Sites.Selected | 僅存取您明確授予的網站 (SharePoint REST)。在步驟 5 中授予每個站台read的角色。 | 

------
#### [ Sites.Selected, with ACLs ]


**Sites.Selected，具有 ACLs**  

| API | 權限 | 用途 | 
| --- | --- | --- | 
| Microsoft Graph | Sites.Selected | 僅存取您明確授予的網站 (Microsoft Graph)。 | 
| Microsoft Graph | User.Read.All | 解決文件層級 ACLs的使用者。 | 
| Microsoft Graph | GroupMember.Read.All | 解決文件層級 ACLs群組成員資格。 | 
| SharePoint | Sites.Selected | 僅存取您明確授予的網站。在步驟 5 中授予每個站台fullcontrol的角色 （讀取 ACLs的項目層級許可時需要）。 | 

------

**注意**  
`Sites.FullControl.All` 授予租用戶中每個網站的廣泛存取權。如果您的組織需要最低權限，請在步驟 5 中使用`Sites.Selected`並授予每個站台的存取權。

## 您在設定期間收集的值
<a name="kb-managed-sharepoint-entra-values"></a>

您在執行這些步驟時建立或收集下列值。您可以在建立資料來源時使用它們。如需詳細資訊，請參閱[連接 SharePoint 資料來源](kb-managed-ds-sharepoint-connect.md)。


**值參考**  

| Value | 在 中建立 | 用於 | 
| --- | --- | --- | 
| 應用程式 (用戶端) ID | 步驟 1 | 秘密 (clientId)。 | 
| 目錄 （租戶） ID | 步驟 1 | 資料來源 tenantId。 | 
| 憑證 — PKCS\#12 套件 (.p12) 及其密碼 | 步驟 3 | 套件 （憑證加上私有金鑰） 會上傳至 Amazon S3 （步驟 6)；密碼會存放在秘密中 (certificatePassword)。 | 
| 憑證 — 公有憑證 (.cer) | 步驟 3 | 相同憑證的公有一半，上傳至 Entra 應用程式註冊 （步驟 4)。 | 
| Amazon S3 儲存貯體名稱和金鑰 | 步驟 6 | 資料來源 certificateS3Path。 | 
| 秘密 ARN | 步驟 7 | 資料來源 secretArn。 | 

## 步驟 1：在 Microsoft Entra ID 中註冊應用程式
<a name="kb-managed-sharepoint-entra-step1"></a>

1. 登入 [Microsoft Entra 管理中心](https://entra.microsoft.com/)。

1. 在左側導覽中，展開 **Entra ID**，然後選擇**應用程式註冊**。

1. 選擇**新增註冊**。

1. 針對**名稱**，輸入描述性名稱，例如 `bedrock-sharepoint-connector`。

1. 對於**支援的 帳戶類型**，**僅選取此組織目錄中的帳戶 （單一租戶）**。

1. 將**重新導向 URI** 保留空白。不需要重新導向 URI，因為應用程式使用用戶端憑證流程，而不是互動式登入流程。

1. 選擇**註冊**。

1. 在應用程式**概觀**頁面上，記錄**應用程式 （用戶端） ID** 和**目錄 （租戶） ID**。您稍後需要兩者。

## 步驟 2：新增 API 許可並授予管理員同意
<a name="kb-managed-sharepoint-entra-step2"></a>

從 新增組態的許可[許可參考](#kb-managed-sharepoint-entra-permissions)。

1. 在您的應用程式註冊中，選擇 **API 許可**，然後選擇**新增許可**。

1. 選擇 **Microsoft Graph**，然後選擇**應用程式許可**。搜尋並選取組態的每個 Microsoft Graph 許可，然後選擇**新增許可**。

1. 再次選擇**新增許可**。選擇 **SharePoint** （在 **Microsoft APIs**下），然後選擇**應用程式許可**。為您的組態選取每個 SharePoint 許可，然後選擇**新增許可**。

1. 在 **API 許可**頁面上，選擇**授予 【您的組織】 的管理員同意**並確認。未經管理員同意，應用程式無法存取 SharePoint 資料。

**注意**  
Microsoft Entra ID 僅應用程式身分驗證使用憑證 （來自步驟 3) 做為登入資料，因此您不會為此應用程式建立用戶端秘密。

## 步驟 3：產生身分驗證憑證
<a name="kb-managed-sharepoint-entra-step3"></a>

產生自我簽署憑證並將其封裝為 PKCS\#12 (`.p12`) 套件。套件同時包含憑證及其私有金鑰，並受密碼保護。您可以將公有憑證上傳到 Entra （步驟 4)，並將`.p12`套件上傳到 Amazon S3 （步驟 6)。選取作業系統的索引標籤以查看命令。

**注意**  
Amazon Bedrock 會從`.p12`套件讀取私有金鑰以簽署身分驗證聲明，因此套件必須受到密碼保護並安全地存放。選擇強式隨機密碼 — 您會將它存放在秘密中，如步驟 7 `certificatePassword`所示。

------
#### [ Linux or macOS (OpenSSL) ]

**產生私有金鑰和自我簽署憑證**

```
openssl req -x509 -newkey rsa:2048 -keyout private_key.pem -out certificate.cer \
    -days 365 -nodes \
    -subj "/CN={{bedrock-sharepoint-connector}}"
```

**將憑證和金鑰封裝為 PKCS\#12 (`.p12`) 套件**

出現提示時，輸入強式匯出密碼。記錄步驟 7。

```
openssl pkcs12 -export -out certificate.p12 \
    -inkey private_key.pem -in certificate.cer
```

您現在有三個檔案：私有金鑰 (`private_key.pem`)、公有憑證 (`certificate.cer`) 和套件 ()`certificate.p12`。您可以在步驟 4 中將公有憑證上傳到 Entra，並在步驟 6 中將`.p12`套件上傳到 Amazon S3。

------
#### [ Windows (PowerShell) ]

**產生自我簽署憑證**

下列 PowerShell 命令會產生具有一年有效期間的 2048 位元 RSA 自我簽署憑證，並將其存放在目前使用者的憑證存放區中。使用強式隨機密碼取代{{您的密碼}} - 您可以將密碼存放在秘密中，如步驟 7 `certificatePassword`所示。

```
$cert = New-SelfSignedCertificate `
    -Subject "CN={{bedrock-sharepoint-connector}}" `
    -CertStoreLocation "Cert:\CurrentUser\My" `
    -KeyAlgorithm RSA `
    -KeyLength 2048 `
    -KeyExportPolicy Exportable `
    -NotAfter (Get-Date).AddYears(1)
```

**匯出公有憑證**

```
Export-Certificate -Cert $cert -FilePath certificate.cer -Type CERT
```

**匯出 PKCS\#12 (`.p12`) 套件**

```
$password = ConvertTo-SecureString -String "{{your-password}}" -Force -AsPlainText
Export-PfxCertificate -Cert $cert -FilePath certificate.p12 -Password $password
```

您現在有兩個檔案：公有憑證 (`certificate.cer`) 和套件 (`certificate.p12`)。您可以在步驟 4 中將公有憑證上傳到 Entra，並在步驟 6 中將`.p12`套件上傳到 Amazon S3。

------

**重要**  
將`.p12`套件存放在 Amazon S3 中 （而非 `.pem`或 `.cer` 檔案）。套件包含 Amazon Bedrock 用來驗證的私有金鑰。文件層級存取控制 ACLs) 需要 `.p12` 格式。對於沒有 ACLs 的純內容爬取，您可以改為存放 PEM 編碼的憑證；因為 `.p12`適用於每個組態，本指南`.p12`會全面使用 。

**注意**  
根據預設，憑證有效期為一年。過期的憑證會導致所有同步失敗，因此請在憑證過期之前輪換憑證。若要變更有效期間，請調整 `-days` 選項 (OpenSSL) 或 `-NotAfter`引數 (PowerShell)。如需輪換步驟，請參閱 [輪換憑證](kb-managed-ds-sharepoint-troubleshooting.md#kb-managed-ds-sharepoint-rotate-cert)。

## 步驟 4：將公有憑證上傳至 Entra
<a name="kb-managed-sharepoint-entra-step4"></a>

1. 在您的應用程式註冊中，選擇**憑證和秘密**，然後選擇**憑證**索引標籤。

1. 選擇**上傳憑證**，然後選取您在步驟 3 中產生的`certificate.cer`檔案 （僅限公有憑證 - 絕不可將`.p12`套件或私有金鑰上傳至 Entra)。

1. 選擇**新增**。

## 步驟 5 （僅限 Sites.Selected)：授予每個站台的存取權
<a name="kb-managed-sharepoint-entra-step5"></a>

**注意**  
只有在您在步驟 2 中選擇`Sites.Selected`許可範圍時才適用此步驟。如果您使用所有網站範圍 (`Sites.Read.All` 或 `Sites.FullControl.All`)，請跳至 [步驟 6：將憑證上傳至 Amazon S3](#kb-managed-sharepoint-entra-step6)。

使用 `Sites.Selected`，您可以透過 Microsoft Graph API 個別授予連接器應用程式存取每個 SharePoint 網站的權限。這需要一個單獨的臨時應用程式，該應用程式保留 `Sites.FullControl.All`並僅用於執行授予。Amazon Bedrock 永遠不會看到此暫時應用程式或其登入資料。

1. **建立暫時授予者應用程式。**在 Entra 管理中心，將第二個應用程式 （例如 `bedrock-sharepoint-granter`) 註冊為沒有重新導向 URI 的單一租用戶。新增 Microsoft Graph `Sites.FullControl.All` 應用程式許可、授予管理員同意，以及建立用戶端秘密。記錄其用戶端 ID 和秘密值。

1. **取得授予者應用程式的存取權杖。**將預留位置取代為授予者應用程式的用戶端 ID 和秘密，以及您的租戶 ID。

   ```
   curl -s -X POST \
     "https://login.microsoftonline.com/{{TENANT_ID}}/oauth2/v2.0/token" \
     -H "Content-Type: application/x-www-form-urlencoded" \
     -d "grant_type=client_credentials" \
     -d "client_id={{GRANTER_CLIENT_ID}}" \
     -d "client_secret={{GRANTER_CLIENT_SECRET}}" \
     -d "scope=https://graph.microsoft.com/.default"
   ```

   回應包含 `access_token`。在下一個命令中使用它做為承載字符。

1. **將每個網站 URL 解析為網站 ID。**使用網站的主機名稱和伺服器相對路徑。

   ```
   curl -s \
     "https://graph.microsoft.com/v1.0/sites/{{contoso}}.sharepoint.com:/sites/{{engineering}}" \
     -H "Authorization: Bearer {{ACCESS_TOKEN}}"
   ```

   回應中的 `id` 欄位是網站 ID。

1. **授予連接器應用程式對網站的存取權。**將 `read`用於僅限內容的爬取，或將 `fullcontrol`用於 ACL 爬取。將 {{CONNECTOR\_CLIENT\_ID}} 取代為步驟 1 中的應用程式 （用戶端） ID。

   ```
   curl -s -X POST \
     "https://graph.microsoft.com/v1.0/sites/{{SITE_ID}}/permissions" \
     -H "Authorization: Bearer {{ACCESS_TOKEN}}" \
     -H "Content-Type: application/json" \
     -d '{
       "roles": ["{{fullcontrol}}"],
       "grantedToIdentities": [{
         "application": {
           "id": "{{CONNECTOR_CLIENT_ID}}",
           "displayName": "{{bedrock-sharepoint-connector}}"
         }
       }]
     }'
   ```

1. 對資料來源中包含的每個網站重複resolve-and-grant命令。完成後，您可以刪除暫時授予者應用程式；每個站台的授予仍然有效。

**重要**  
每個網站授予不會追溯。如果您稍後將網站新增至資料來源，請在下一次同步之前授予連接器應用程式對該網站的存取權，否則不會編目其內容。

## 步驟 6：將憑證上傳至 Amazon S3
<a name="kb-managed-sharepoint-entra-step6"></a>

從步驟 3 上傳`.p12`套件到與知識庫位於相同區域中的 Amazon S3 儲存貯 AWS 體。記錄儲存貯體名稱和金鑰 — 您可以使用它們做為資料來源 `certificateS3Path`。

```
aws s3api put-object \
  --bucket {{your-certificate-bucket}} \
  --key {{certs/certificate.p12}} \
  --body certificate.p12 \
  --server-side-encryption AES256
```

**注意**  
建議您在憑證物件上啟用伺服器端加密，並將儲存貯體限制為需要它的主體。套件包含私有金鑰。

## 步驟 7：建立 Secrets Manager 秘密
<a name="kb-managed-sharepoint-entra-step7"></a>

將登入資料存放在 AWS Secrets Manager 秘密中。對於 Entra ID 僅限應用程式身分驗證，請包含下列鍵值對：
+ `clientId` （必要） — 步驟 1 中的應用程式 （用戶端） ID。
+ `certificatePassword` （建議） — 您在步驟 3 中於`.p12`套件上設定的密碼。請參閱以下備註。

```
{
    "clientId": "{{your-client-id}}",
    "certificatePassword": "{{your-certificate-password}}"
}
```

使用 建立秘密 AWS Command Line Interface：

```
aws secretsmanager create-secret \
  --name {{bedrock-sharepoint-creds}} \
  --secret-string file://secret.json
```

從回應記錄秘密 ARN。您可以使用它做為資料來源 `secretArn`。

**注意**  
將 `certificatePassword`設定為您在步驟 3 中建立`.p12`套件時所使用的密碼。如果您省略此欄位，Amazon Bedrock 會使用應用程式的用戶端 ID 做為密碼來開啟套件，因此套件必須使用用戶端 ID 做為其密碼來建立。我們建議您一律改為設定明確、高熵的密碼，並安全地存放私有金鑰。

**注意**  
**請改用 PEM 憑證。**本指南使用`.p12`套件，適用於每個組態。如果您僅編目內容 （無文件層級存取控制），則可以改用 PEM 憑證。在這種情況下，請僅將*公*有憑證上傳至 Amazon S3 （而非`.p12`套件），並將私有金鑰以 `privateKey`（未加密的 base64 編碼 PKCS\#8，不含標頭行） 的形式存放在秘密中，以取代 `certificatePassword`：  

```
{
    "clientId": "{{your-client-id}}",
    "privateKey": "{{your-base64-pkcs8-private-key}}"
}
```

## 步驟 8：授予服務角色對憑證的存取權
<a name="kb-managed-sharepoint-entra-step8"></a>

您的知識庫服務角色必須能夠從 Amazon S3 讀取憑證物件。將下列陳述式新增至角色的許可政策，將儲存貯體名稱和金鑰取代為您的值。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "S3ListCertificateBucket",
            "Effect": "Allow",
            "Action": ["s3:ListBucket"],
            "Resource": ["arn:aws:s3:::{{your-certificate-bucket}}"],
            "Condition": {
                "StringEquals": { "aws:ResourceAccount": ["{{123456789012}}"] }
            }
        },
        {
            "Sid": "S3GetCertificate",
            "Effect": "Allow",
            "Action": ["s3:GetObject"],
            "Resource": [
                "arn:aws:s3:::{{your-certificate-bucket}}/{{certs/certificate.p12}}",
                "arn:aws:s3:::{{your-certificate-bucket}}/{{certs/certificate.p12}}.metadata.json"
            ],
            "Condition": {
                "StringEquals": { "aws:ResourceAccount": ["{{123456789012}}"] }
            }
        }
    ]
}
```

**注意**  
此政策也允許隨憑證一起讀取選用`.metadata.json`檔案。Amazon Bedrock 不需要此檔案；包括防止存在存取錯誤的許可。

**如果憑證物件使用 AWS KMS 金鑰加密**

中的上傳命令[步驟 6：將憑證上傳至 Amazon S3](#kb-managed-sharepoint-entra-step6)使用 Amazon S3-managed加密 (`AES256`)，不需要額外的許可。如果您使用客戶受管 KMS 金鑰 (SSE-KMS) 使用 Amazon S3 伺服器端加密來加密憑證物件，則服務角色也需要該金鑰的`kms:Decrypt`許可，而且金鑰的政策必須允許該角色使用它。使用 AWS 受管`aws/s3`金鑰加密的物件不需要此額外授權。

```
{
    "Sid": "KmsDecryptCertificate",
    "Effect": "Allow",
    "Action": ["kms:Decrypt"],
    "Resource": ["arn:aws:kms:{{us-west-2}}:{{123456789012}}:key/{{your-key-id}}"]
}
```

讀取存取只需要 `kms:Decrypt`。如需詳細資訊，請參閱[搭配使用伺服器端加密與 AWS KMS 金鑰 (SSE-KMS)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html)。

如需完整的知識庫服務角色許可，請參閱 [存取您的資料來源的許可](kb-permissions.md#kb-permissions-access-ds)。

## 後續步驟
<a name="kb-managed-sharepoint-entra-next"></a>

您現在擁有建立資料來源所需的一切：秘密 ARN、租用戶 ID 和憑證的 Amazon S3 位置。若要使用 AWS 管理主控台 或 API 建立 SharePoint 資料來源，請參閱 [連接 SharePoint 資料來源](kb-managed-ds-sharepoint-connect.md)。

**重要**  
針對`ENTRA_ID_APP_ONLY`身分驗證，您必須在建立資料來源`certificateS3Path`時提供 ，即使 ACLs已停用也一樣。使用此身分驗證類型建立且沒有憑證的 SharePoint 資料來源失敗。