オブジェクト・ストレージ・ファイルの機密データの識別 (2024/10/30)

オブジェクト・ストレージ・ファイルの機密データの識別 (2024/10/30)

https://blogs.oracle.com/ateam/post/identifying-sensitive-data-in-object-storage-files

投稿者: Ramesh Balajepalli | Master Cloud Architect


お客様は、耐久性、パフォーマンス、高可用性、組み込みのセキュリティ機能により、膨大な量のデータをOracle Cloud Infrastructure(OCI)Object Storageに格納することが増えています。ただし、データ量が時間の経過とともに増加するにつれて、名前、住所、電話番号などの個人識別子やAPIキー、認証トークン、リソース識別子などの認証資格証明などの機密情報がObject Storageに追加されています。


Object Storageはセキュアですが、機密データを含むファイルを識別し、そのデータを表示できるユーザーに対するより強力なアクセス・ポリシーなど、保護の追加レイヤーを適用することは、この情報を保護し、規制コンプライアンスを確保するために重要です。


このブログ投稿では、OCIのDocument Understanding AIサービスを使用して、オブジェクト・ストレージ・バケットに格納されているファイル内の機密情報を検出する方法を説明します。このソリューションにより、組織は効果的なアクセス制御を実装し、データ保護規則への準拠を維持できます。


機密データの識別が重要な理由


  • 規制コンプライアンス
  • データ侵害防止
  • データの最小化
  • アクセス制御の最適化


プロセスの自動化: 機密データのファイルのスキャン


組織が膨大な量の非構造化データや半構造化データを蓄積するにつれて、すべてのファイルを手動で機密情報を確認することは現実的ではありません。この課題に対処するために、OCI AI Languageなどのツールを活用して個人を特定できる情報(PII)を検出することで、プロセスを簡素化できます。


次のPythonスクリプトは、OCIオブジェクト・ストレージに格納されているファイル内の機密データの識別を自動化する方法を示しています。


import oci
import json
import csv
import xml.etree.ElementTree as ET
from PyPDF2 import PdfReader  
from io import BytesIO, StringIO 

config = oci.config.from_file()

object_storage_client = oci.object_storage.ObjectStorageClient(config)
ai_language_client = oci.ai_language.AIServiceLanguageClient(config)

bucket_name = "Sensitive_Bucket"
namespace = "namespace"
compartment_id = "ocid1.compartment.oc1..aaaaaaa"

bucket_tag_key = 'data_sensitivity_level'
bucket_tag_value = 'High'  
output_file = 'pii_scan_results.json'

objects = object_storage_client.list_objects(namespace, bucket_name).data.objects

output_data = []
sensitive_files_found = False  

def analyze_text_for_pii(text):
    response = ai_language_client.batch_detect_language_pii_entities(
        batch_detect_language_pii_entities_details=oci.ai_language.models.BatchDetectLanguagePiiEntitiesDetails(
            documents=[oci.ai_language.models.TextDocument(
                key="document_key",
                text=text,
                language_code="en")],
            compartment_id=compartment_id
        )
    )
    return response

def tag_bucket(sensitivity_level):
    update_bucket_response = object_storage_client.update_bucket(
        namespace_name=namespace,
        bucket_name=bucket_name,
        update_bucket_details=oci.object_storage.models.UpdateBucketDetails(
            freeform_tags={bucket_tag_key: bucket_tag_value}
        )
    )
    print(f"Bucket {bucket_name} tagged with {bucket_tag_key}: {sensitivity_level}")

def extract_text_from_json(content):
    try:
        data = json.loads(content)
        return json.dumps(data, indent=4)  
    except json.JSONDecodeError:
        return ""

def extract_text_from_xml(content):
    try:
        tree = ET.ElementTree(ET.fromstring(content))
        root = tree.getroot()
        return ET.tostring(root, encoding='unicode', method='text')  
    except ET.ParseError:
        return ""

def extract_text_from_pdf(content):
    try:        
        pdf_stream = BytesIO(content)
        reader = PdfReader(pdf_stream)
        text = ""
        for page in reader.pages:
            text += page.extract_text() 
        return text
    except Exception as e:
        print(f"Error extracting PDF content: {e}")
        return ""

def extract_text_from_csv(content):
    try:
        csv_stream = StringIO(content.decode('utf-8'))
        csv_reader = csv.reader(csv_stream)
        csv_text = ""
        for row in csv_reader:
            csv_text += ", ".join(row) + "\n"  
        return csv_text
    except Exception as e:
        print(f"Error extracting CSV content: {e}")
        return ""
    
def read_object_content(object_name, file_type):
    object_data = object_storage_client.get_object(namespace, bucket_name, object_name).data
    content = object_data.content
    if file_type == 'txt':
        return content.decode('utf-8')  
    elif file_type == 'json':
        return extract_text_from_json(content.decode('utf-8')) 
    elif file_type == 'xml':
        return extract_text_from_xml(content.decode('utf-8')) 
    elif file_type == 'pdf':
        return extract_text_from_pdf(content) 
    elif file_type == 'csv':
        return extract_text_from_csv(content) 
    return None

allowed_file_types = ['txt', 'json', 'xml', 'pdf', 'csv']  

for obj in objects:
    object_name = obj.name
    file_extension = object_name.split('.')[-1].lower()        
    if file_extension in allowed_file_types:
        print(f"Analyzing document: {object_name}")        
        try:
            file_content = read_object_content(object_name, file_extension)
            if file_content:
                response = analyze_text_for_pii(file_content)                
                pii_entities = []
                for document in response.data.documents:
                    for entity in document.entities:
                        pii_entities.append({
                            "entity_type": entity.type,
                            "text": entity.text
                        })                
                if pii_entities:
                    sensitive_files_found = True  
                    output_data.append({
                        "bucket_name": bucket_name,
                        "object_name": object_name,
                        "pii_entities": pii_entities
                    })        
        except oci.exceptions.ServiceError as e:
            print(f"Error analyzing document {object_name}: {e}")
if sensitive_files_found:
    tag_bucket(bucket_tag_value)

with open(output_file, 'w') as json_file:
    json.dump(output_data, json_file, indent=4)

print(f"PII scan completed. Results written to {output_file}")


スクリプトで更新


  • bucket_name: 機密データをスキャンするバケットの名前。
  • namespace: バケットのネームスペース。
  • compartment_id: Document Understandingサービスが実行されるコンパートメントID。
  • bucket_tag_keyおよびbucket_tag_value: 機密データが識別されるときにバケットにタグ付けするために使用されるキーと値のペア。
  • output_file: 識別された機密データに関する詳細情報を保存するファイルへのパス。


このソリューションは、TXT、CSV、JSON、XML、PDFなどの複数のファイル形式をサポートし、名前、電子メール、クレジット・カード番号などの機密データ型を自動的にスキャンします。ドキュメント理解サービスでサポートされるフィールドの詳細は、このページを参照してください。


スクリプトが実行されると、識別された機密データによって、バケットが指定されたキーと値のペアでタグ付けされます。さらに、検出された機密データに関する詳細情報を含むファイル(output_file)が作成されます。


Output_Fileのサンプル・レスポンス


[
    {
        "bucket_name": "Sensitive_Bucket",
        "object_name": "all_types_of_pii.txt",
        "pii_entities": [
            {
                "entity_type": "PERSON",
                "text": "John Doe"
            },
            {
                "entity_type": "ADDRESS",
                "text": "1234 Elm Street, Springfield, IL 62704"
            },
            {
                "entity_type": "AGE",
                "text": "35"
            }
        ]
    },
    {
        "bucket_name": "Sensitive_Bucket",
        "object_name": "name.pdf",
        "pii_entities": [
            {
                "entity_type": "PERSON",
                "text": "John Doe"
            },
            {
                "entity_type": "EMAIL",
                "text": "john.doe@example.com"
            },
            {
                "entity_type": "TELEPHONE_NUMBER",
                "text": "123 -456-7890\""
            }
        ]
    },
    {
        "bucket_name": "Sensitive_Bucket",
        "object_name": "pii.txt",
        "pii_entities": [
            {
                "entity_type": "IP_ADDRESS",
                "text": "192.168.1.1"
            },
            {
                "entity_type": "MAC_ADDRESS",
                "text": "00:14:22:01:23:45"
            },
            {
                "entity_type": "COOKIE",
                "text": "COOKIE: sessionid=38afes7a8; Path=/; Secure; HttpOnly\r\n"
            },
            {
                "entity_type": "JSON_WEB_TOKEN",
                "text": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
            }
        ]
    },
    {
        "bucket_name": "Sensitive_Bucket",
        "object_name": "sample_pii_data.csv",
        "pii_entities": [
            {
                "entity_type": "OCI_OCID_REFERENCE",
                "text": "ocid1.user.oc1..aaaaaaaa5fhegy2c7z5g4isokvrljafadk6jdslj5xdvkhzjlf77h4jrwima"
            },
            {
                "entity_type": "EMAIL",
                "text": "ocid1.user.oc1..aaaaa@oracle.com"
            },
            {
                "entity_type": "IP_ADDRESS",
                "text": "6a:32:17:ff:6f:3c:82:aa\r"
            },
            {
                "entity_type": "OCI_STORAGE_SIGNED_URL",
                "text": "https://objectstorage.us-phoenix-1.oraclecloud.com/n/namespace-string/b/bucketname/o/objectname?X-Amz-Signature=d5a1a6d5e1bfa6b7a38d\r"
            }
        ]
    },
    {
        "bucket_name": "Sensitive_Bucket",
        "object_name": "sample_pii_data.json",
        "pii_entities": [
            {
                "entity_type": "PERSON",
                "text": "John Doe"
            },
            {
                "entity_type": "EMAIL",
                "text": "john.doe@example.com"
            }
        ]
    }
]


自動PII検出とレポート作成をデータ管理戦略に統合することで、機密データが適切に保護され、リスクを最小限に抑え、進化するデジタル環境でコンプライアンスを維持できます。


コメント

このブログの人気の投稿

Oracle Database 19cサポート・タイムラインの重要な更新 (2024/11/20)

Oracle APEXのInteractive Gridで、Oracle Formsと比較して、重複行の検証を制御/通過させる方法 (2022/07/21)

Oracle APEX 24.1の一般提供の発表 (2024/06/17)