在AEM as a Cloud Service中管理秘密

管理秘密(例如API金鑰和密碼)對於維護應用程式安全性至關重要。 Adobe Experience Manager (AEM) as a Cloud Service提供強大的工具,可安全地處理秘密。

在本教學課程中,您將學習在AEM中管理秘密的最佳實務。 我們將介紹AEM所提供的保護您敏感資訊的工具和技術,確保您的應用程式安全無虞且機密無虞。

本教學課程假定您具備AEM Java開發、OSGi服務、Sling模型和AdobeCloud Manager的工作知識。

密碼管理員OSGi服務

在AEM as a Cloud Service中,透過OSGi服務管理秘密提供可擴充且安全的方法。 OSGi服務可設定為處理敏感資訊,例如API金鑰和密碼、透過OSGi設定來定義,以及透過Cloud Manager設定。

OSGi服務實施

我們將逐步開發自訂OSGi服務,會公開OSGi設定的秘密

實作透過@Activate方法從OSGi設定讀取秘密,並透過getSecret(String secretName)方法公開這些秘密。 或者,您可以為每個密碼建立離散方法,例如getApiKey(),但此方法需要更多維護,因為新增或移除密碼時。

package com.example.core.util.impl;

import com.example.core.util.SecretsManager;
import org.osgi.service.component.annotations.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.sling.api.resource.ValueMap;
import org.apache.sling.api.resource.ValueMapDecorator;
import java.util.Map;

@Component(
    service = { SecretsManager.class }
)
public class SecretsManagerImpl implements SecretsManager {
    private static final Logger log = LoggerFactory.getLogger(SecretsManagerImpl.class);

    private ValueMap secrets;

    @Override
    public String getSecret(String secretName) {
        return secrets.get(secretName, String.class);
    }

    @Activate
    @Modified
    protected void activate(Map<String, Object> properties) {
        secrets = new ValueMapDecorator(properties);
    }
}

身為OSGi服務,最好透過Java介面註冊及使用。 底下是簡單的介面,可讓消費者透過OSGi屬性名稱取得秘密。

package com.example.core.util;

import org.osgi.annotation.versioning.ConsumerType;

@ConsumerType
public interface SecretsManager {
    String getSecret(String secretName);
}

將密碼對應至OSGi設定

若要公開OSGi服務中的密碼值,請使用OSGi密碼組態值將它們對應到OSGi組態。 將OSGi屬性名稱定義為金鑰,以從SecretsManager.getSecret()方法擷取秘密值。

在您的AEM Maven專案的OSGi設定檔案/apps/example/osgiconfig/config/com.example.core.util.impl.SecretsManagerImpl.cfg.json中定義秘密。 每個屬性都代表AEM中公開的秘密,其值是透過Cloud Manager設定。 金鑰是OSGi屬性名稱,用來從SecretsManager服務擷取秘密值。

{
    "api.key": "$[secret:api_key]",
    "service.password": "$[secret:service_password]"
}

除了使用共用密碼管理員OSGi服務之外,您可以直接在使用密碼的特定服務的OSGi設定中包含密碼。 如果只有單一OSGi服務需要秘密,且未在多個服務之間共用秘密,則此方法會很實用。 在此案例中,秘密值定義於特定服務的OSGi設定檔案中,並透過@Activate方法存取服務的Java程式碼。

使用秘密

可以透過各種方式從OSGi服務使用秘密,例如從Sling模型或其他OSGi服務。 以下是如何從兩者中取用秘密的範例。

從Sling模型

Sling模型通常會為AEM網站元件提供商業邏輯。 SecretsManager OSGi服務可以透過@OsgiService註解使用,並在Sling模型內用於擷取秘密值。

import com.example.core.util.SecretsManager;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.servlets.SlingHttpServletRequest;
import org.apache.sling.models.annotations.Model;
import org.apache.sling.models.annotations.OsgiService;

@Model(
    adaptables = {SlingHttpServletRequest.class, Resource.class},
    adapters = {ExampleDatabaseModel.class}
)
public class ExampleDatabaseModelImpl implements ExampleDatabaseModel {

    @OsgiService
    SecretsManager secretsManager;

    @Override
    public String doWork() {
        final String secret = secretsManager.getSecret("api.key");
        // Do work with secret
    }
}

來自OSGi服務

OSGi服務通常會在AEM中公開可重複使用的商業邏輯,供Sling模型、AEM服務(例如工作流程)或其他自訂OSGi服務使用。 SecretsManager OSGi服務可以透過@Reference註解使用,並在OSGi服務內用來擷取秘密值。

import com.example.core.util.SecretsManager;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;

@Component
public class ExampleSecretConsumerImpl implements ExampleSecretConsumer {

    @Reference
    SecretsManager secretsManager;

    public void doWork() {
        final String secret = secretsManager.getSecret("service.password");
        // Do work with the secret
    }
}

在Cloud Manager中設定秘密

OSGi服務和設定就緒後,最後一個步驟就是在Cloud Manager中設定秘密值。

密碼的值可以透過Cloud Manager API設定,或是更常見的透過Cloud Manager UI設定。 若要透過Cloud Manager UI套用機密變數:

Cloud Manager密碼設定

  1. 登入AdobeCloud Manager

  2. 選取您要設定密碼的AEM程式和環境。

  3. 在「環境詳細資料」檢視中,選取「組態」標籤。

  4. 選取「新增」。

  5. 在「環境設定」對話方塊中:

    • 輸入OSGi設定中參照的密碼變數名稱(例如api_key)。
    • 輸入密碼值。
    • 選取要套用密碼的AEM服務。
    • 選取​ 密碼 ​作為型別。
  6. 選取​ 新增 ​以保留密碼。

  7. 視需要新增儘可能多的秘密。 完成時,選取​ 儲存,將變更立即套用至AEM環境。

針對秘密使用Cloud Manager設定的好處是,可以為不同的環境或服務套用不同的值,並且無需重新部署AEM應用程式即可旋轉秘密。

recommendation-more-help
4859a77c-7971-4ac9-8f5c-4260823c6f69