全部產品
Search
文件中心

Simple Log Service:使用Project Policy管理Log Service資源存取權限

更新時間:Oct 11, 2025

Project Policy是Log Service推出的針對Project的授權策略,通過Project Policy授權指定網路或IP訪問Simple Log Service資源的許可權。

背景介紹

SLS的Project預設可以從任意IP寫入資料,當通過LoongCollector(原Logtail)向SLS寫資料時,非預期來來源資料也可能被寫入。因此需要Project Policy做一層安全攔截,指定可以寫入資料的IP段。例如線上已有穩定啟動並執行生產叢集A,日誌寫入Project A,並配置了警示等自動化營運策略,為了防止測試叢集或新叢集的日誌誤寫入Project A對日常營運造成幹擾,就可以使用Project Policy。

使用前須知

  • Project Policy僅支援通過SDK配置,暫不控制台入口。

  • 瞭解Action、Resource以及Condition等授權資訊

  • 配置Project Policy時,若授權使用者選擇了匿名帳號(*):

    • 不包含Condition的情況下,則Project Policy僅對Project Owner以外的所有使用者生效。

    • 包含Condition的情況下,則Project Policy會對包含Project Owner在內的所有使用者生效。

使用樣本

以Java SDK為例展示設定Project Policy的流程,更多語言參考SDK概述

  1. 下載Java SDK開發包

  2. 建立src/main/java/com/aliyun/openservices/log/sample/ProjectPolicyDemo.java。

  3. 根據情境使用如下範例程式碼,根據注釋修改參數值。

    重要
    • 執行setProjectPolicy方法的效果是覆蓋原有配置,暫不支援追加。

    • 啟動程式後Policy生效大約需要1分鐘。

僅允許指定VPC訪問某個Project資源

範例程式碼

權限原則

代碼中參數擷取方式參考如下:

  • accessKeyId與accessKey擷取參考建立AccessKey

  • endPoint擷取方式:

    1. 登入Log Service控制台,在Project列表中,單擊目標Project。

    2. 單擊Project名稱右側的image進入專案概覽頁面,在訪問網域名稱中複製公網網域名稱。

package com.aliyun.openservices.log.sample;

import com.aliyun.openservices.log.Client;
import com.aliyun.openservices.log.exception.LogException;
import org.junit.Assert;

public class ProjectPolicyDemo {
	// 本樣本從環境變數中擷取AccessKey ID和AccessKey Secret
	static String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
	static String accessKey = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
	static String endPoint = "your-endpoint"; // 修改為Log ServiceProject的地區對應的endPoint。
        static String projectName = "example-project";// 修改為Log ServiceProject的名稱。
	static Client client = new Client(endPoint, accessKeyId, accessKey);

	public static void main(String[] args) throws LogException {
		try {
			client.GetProject(projectName);
		} catch (LogException e) {
			Assert.fail("should not fail : " + e.GetErrorCode());
		}
		String policyText="{\"Version\":\"1\",\"Statement\":[{\"Action\":[\"log:*\"],\"Principal\": [\"*\"],\"Resource\":\"acs:log:*:*:project/" + projectName + "/*\",\"Condition\": {\"StringNotEquals\": {\"acs:SourceVpc\": [\"vpc-t4nlw426y44rd3iq4****\"]}},\"Effect\":\"Deny\"}]}";
		client.setProjectPolicy(projectName, policyText); 
		client.getProjectPolicy(projectName);
		Assert.assertEquals(policyText, client.getProjectPolicy(projectName).getPolicyText());
	}
}

範例程式碼中policyText使用的權限原則如下,表示僅允許來自VPC ID為t4nlw426y44rd3iq4****的請求訪問名為example-project的Project 。

{
    "Version": "1",
    "Statement": [
        {
            "Action": [
                "log:*"
            ],
            "Principal": [
                "*"
            ],
            "Resource": "acs:log:*:*:project/example-project/*",
            "Condition": {
                "StringNotEquals": {
                    "acs:SourceVpc": [
                        "vpc-t4nlw426y44rd3iq4****"
                    ]
                }
            },
            "Effect": "Deny"
        }
    ]
}

禁止特定IP訪問

範例程式碼

權限原則

代碼中參數擷取方式參考如下:

  • accessKeyId與accessKey擷取參考建立AccessKey

  • endPoint擷取方式:

    1. 登入Log Service控制台,在Project列表中,單擊目標Project。

    2. 單擊Project名稱右側的image進入專案概覽頁面,在訪問網域名稱中複製公網網域名稱。

package com.aliyun.openservices.log.sample;

import com.aliyun.openservices.log.Client;
import com.aliyun.openservices.log.exception.LogException;
import org.junit.Assert;

public class ProjectPolicyDemo {
	// 本樣本從環境變數中擷取AccessKey ID和AccessKey Secret
	static String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
	static String accessKey = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
	static String endPoint = "your-endpoint"; // 修改為Log ServiceProject的地區對應的endPoint。
        static String projectName = "example-project";// 修改為Log ServiceProject的名稱。
	static Client client = new Client(endPoint, accessKeyId, accessKey);

	public static void main(String[] args) throws LogException {
		try {
			client.GetProject(projectName);
		} catch (LogException e) {
			Assert.fail("should not fail : " + e.GetErrorCode());
		}
		String policyText="{\"Version\":\"1\",\"Statement\":[{\"Action\":[\"*\"],\"Principal\": [\"*\"],\"Resource\":\"acs:log:*:*:project/" + projectName + "/*\",\"Condition\": {\"IpAddress\":{\"acs:SourceIp\":[\"192.168.0.0\",\"172.16.215.218\"]}},\"Effect\":\"Deny\"}]}";
		client.setProjectPolicy(projectName, policyText);
		client.getProjectPolicy(projectName);
		Assert.assertEquals(policyText, client.getProjectPolicy(projectName).getPolicyText());
	}
}

下述權限原則表示192.168.0.0和172.16.215.218這兩個IP地址不能訪問名為example-project的Project。

{
    "Version":"1",
    "Statement":[
        {
            "Effect":"Deny",
            "Action":[
                "*"
            ],
            "Principal":[
                "*"
            ],
            "Resource":"acs:log:*:*:project/example-project/*",
            "Condition":{
                "IpAddress":{
                    "acs:SourceIp":[
                        "192.168.0.0",
                        "172.16.215.218"
                    ]
                }
            }
        }
    ]
}

禁止外網IP寫入

範例程式碼

權限原則

代碼中參數擷取方式參考如下:

  • accessKeyId與accessKey擷取參考建立AccessKey

  • endPoint擷取方式:

    1. 登入Log Service控制台,在Project列表中,單擊目標Project。

    2. 單擊Project名稱右側的image進入專案概覽頁面,在訪問網域名稱中複製公網網域名稱。

package com.aliyun.openservices.log.sample;

import com.aliyun.openservices.log.Client;
import com.aliyun.openservices.log.exception.LogException;
import org.junit.Assert;

public class ProjectPolicyDemo {
	// 本樣本從環境變數中擷取AccessKey ID和AccessKey Secret
	static String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
	static String accessKey = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
	static String endPoint = "your-endpoint"; // 修改為Log ServiceProject的地區對應的endPoint。
        static String projectName = "example-project";// 修改為Log ServiceProject的名稱。
	static Client client = new Client(endPoint, accessKeyId, accessKey);

	public static void main(String[] args) throws LogException {
		try {
			client.GetProject(projectName);
		} catch (LogException e) {
			Assert.fail("should not fail : " + e.GetErrorCode());
		}
		String policyText="{\"Version\":\"1\",\"Statement\":[{\"Action\":[\"log:PostLogStoreLogs\"],\"Principal\": [\"*\"],\"Resource\":\"acs:log:*:*:project/" + projectName + "/*\",\"Condition\":{\"StringNotLike\": {\"acs:SourceVpc\":[\"vpc-*\"]}},\"Effect\":\"Deny\"}]}";
		client.setProjectPolicy(projectName, policyText);
		client.getProjectPolicy(projectName);
		Assert.assertEquals(policyText, client.getProjectPolicy(projectName).getPolicyText());
	}
}

下述權限原則表示拒絕使用外網寫入日誌到名為example-project的Project。

{
    "Version": "1",
    "Statement": [
        {
            "Effect": "Deny",
            "Action": [
                "log:PostLogStoreLogs"
            ],
            "Principal": [
                "*"
            ],
            "Resource": "acs:log:*:*:project/example-project/*",
            "Condition": {
                "StringNotLike": {
                    "acs:SourceVpc": [
                        "vpc-*"
                    ]
                }
            }
        }
    ]
}

刪除Project Policy

如果後續不需要存取控制,可刪除Project Policy。

package com.aliyun.openservices.log.sample;

import com.aliyun.openservices.log.Client;
import com.aliyun.openservices.log.exception.LogException;
import org.junit.Assert;

public class ProjectPolicyDemo {
	// 本樣本從環境變數中擷取AccessKey ID和AccessKey Secret
	static String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
	static String accessKey = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
	static String endPoint = "your-endpoint"; // 修改為Log ServiceProject的地區對應的endPoint。
        static String projectName = "example-project";// 修改為Log ServiceProject的名稱。
	static Client client = new Client(endPoint, accessKeyId, accessKey);

	public static void main(String[] args) throws LogException {
		client.deleteProjectPolicy(projectName);
		Assert.assertEquals("", client.getProjectPolicy(projectName).getPolicyText());
	}
}