מציאת PII באמצעות למידת מכונה

כך תגנו על משתמשים שלכם שמעלים מידע אישי רגיש כמו תעודות זהות באמצעות שירות אמאזוני.

מה קורה אם יש לי קבצים גרפיים שמשתמשים מעלים לשרתים שלי, אבל אני לא מעוניין שהם יעלו יחד עם הקבצים תמונות של תעודות זהות או מידע אישי מזהה אחר (שזה ראשי התבות של PII). זה קורה לפעמים, גם אם אני מתרה במשתמשים שלא להעלות קבצים בעייתיים עם תמונות בעייתיות, הם נוטים לעשות את זה ואז אני בבעיה. אני לא תמיד רוצה להחזיק במידע הזה – גם אם המשתמשים מעלים אותו מרצונם. החזקה של מידע מזהה אישי היא אופרה אחרת לגמרי מבחינה חוקית ותפעולית. אז איך אני יכול למנוע ממשתמשים להעלות תעודות זהות או מידע אחר?

פעם היה מדובר במנגנון שהיה מחייב ביקורת אנושית מקיפה. דבר שאפשרי בהחלט כשמדובר בכמה מאות או אלפי קבצים אבל בעייתי כשמדובר בסקייל גדול יותר, למשל עשרות אלפי קבצים או אפילו מאות קבצים אך כאלו שמגיעים בבת אחת.

היום אנחנו יכולים להשתמש בלמידת מכונה כדי למצוא דברים כאלו. אפשר לאמן מודל משלנו עם תעודות זהות על מנת שיזהה את תעודות הזהות וזה אפילו לא מאד מסובך, אבל אפשר להשתמש גם במודולים קיימים. יש כמה פתרונות שניתן לעבוד איתם ואראה את הפתרון היותר פשוט ונאיבי שמבוסס על שירות של אמזון בשם Rekognition שבו כל אחד יכול להשתמש.

השירות של אמאזון דורש רישום ב-AWS כמובן וניתן לגשת אליו כמו כל שירות של אמאזון – פשוט דרך הממשק.

Amazon Rekognition
Deep learning-based visual analysis service
Search, verify, and organize millions of images and videos

אם ננסה את הדמו, נראה שאנחנו נגיע לממשק שבו אנו יכולים להעלות תמונות. אני אנסה להעלות תמונות של מידע מאתר ממשלתי שיש בו מסמכים מעורבים – גם מסמכים שצריכים להופיע וגם צילומי תעודות זהות שלא אמורים להופיע.

תמונה מטושטשת, ניתן להבחין בכמה תעודות מזהות.

כמובן שלממשק העליתי תמונה לא מטושטשת. אני מעלה את התמונה ואז מסתכל על ה-Label detection ואפשר לראות שאכן השירות מזהה באופן מושלם את התעודות המזהות וגם את הפרצופים. הנה זיהוי לדוגמה:

        {
            "Name": "Id Cards",
            "Confidence": 80.23699188232422,
            "Instances": [],
            "Parents": [
                {
                    "Name": "Document"
                },
                {
                    "Name": "Text"
                }
            ],
            "Aliases": [],
            "Categories": [
                {
                    "Name": "Text and Documents"
                }
            ]
        },

אפשר לראות פה שני דברים חשובים. ראשית התוית Id Cards ורמת הבטחון, שבמקרה הזה היא 80 אחוז. מדובר בתעודת זיהוי ישראלית אגב.

טוב, אז הדמו עובד. איך אנחנו מתקדמים לשירות אמיתי? פה יש לנו שתי אפשרויות. או להשתמש ב-AWS SDK או לבנות למבדה שתתקשר עם השירות הזה. אני אדגים עם השיטה הפשוטה ביותר. ראשית, ניצור דרך IAM משתמש שיש לו הרשאות ל-Rekongition ונקבל את ה-credentials שלו:

קבלת Access key ו-Secret Access key

מאד חשוב לוודא ביצירת המשתמש שיש לו Role שמאפשר לו לגשת אל Rekognition.

נכניס את הפרטים האלו בתיקית הבית תחת התיקיה aws ושם הקובץ credentials:

[default]
aws_access_key_id = YOUR_ACCESS_KEY_ID
aws_secret_access_key = YOUR_SECRET_ACCESS_KEY

עכשיו ניגש לפרויקט עצמו, ניצור תיקיה ופרויקט Node באמצעות npm init -y

נתקין את המודולים של AWS SDK באמצעות:

npm install @aws-sdk/client-rekognition @aws-sdk/lib-storage

ועכשיו אל הקוד:

const { RekognitionClient, DetectLabelsCommand } = require("@aws-sdk/client-rekognition");
const { readFileSync } = require('fs');

// Create a Rekognition Client
const client = new RekognitionClient({ region: "us-west-2" });

// Function to detect labels in an image
const detectLabels = async (imageData) => {
    const params = {
        Image: {
            Bytes: imageData
        },
        MaxLabels: 10,
        MinConfidence: 70
    };

    try {
        const command = new DetectLabelsCommand(params);
        const response = await client.send(command);
        console.log(response);
    } catch (err) {
        console.error(err);
    }
};

// Read an image file
const imageBytes = readFileSync('./demo-image-pii.jpg');
detectLabels(imageBytes);

הקוד הוא די פשוט (שימו לב שאני ממליץ לא להעתיק אותו משיקולי אבטחה וביצועים, הוא נועד להראות רק כמה זה קל, אבל לגמרי מומלץ להוסיף למשל וידוא לנתיב של הקובץ אם הוא מגיע מבחוץ ובכלל, בסביבת פרודקשן מומלץ לא להכניס את המפתח של אמזון בצורה כזו אלא להשתמש ב key management service זה או או אחר). אבל בשביל הדמו זה יהיה מעולה.

אנו נקבל את הפרטים, אפשר להוסיף עכשיו לוגיקה שבודקת את המערך – יש תעודת זהות עם בטחון מסוים? זה הזמן לבצע פעולה מסוימת – התראה, הכנסה לתור לבדיקה אנושית או אפילו פסילת המסמך ובקשה מהמשתמש שהעלה אותו שיחשוב שוב אם זה חכם להעלות תעודה מזהה.

כמובן שאפשר להשתמש גם בקוד של למבדה למערכת הזו.

המחיר הוא $0.001 לתמונה. כאשר מותר עד חמישה מגהביט לא משהו שיפיל אתכם. אם המערכת שלכם מטפלת במיליון תמונות בשנה, העלות תהיה 1000 דולר. יש מצב שתצטרכו לבחור, בהתאם לתנאים החוקיים, באיזור ספציפי של אמזון (יש גם בישראל, למרות שלא ניסיתי) – שימו לב ש rekognition יהיה זמין שם וגם שהאיזור יהיה מאופשר לחשבון שלכם באמזון.

אפשר לבצע גילוי נוסף – למשל של פרצופים או של טקסט והמידע יינתן לכם באותה סריקה. אבל במקרה הזה, השירות הזה הוא מספיק טוב למציאת תעודות זהות סרוקות שהלקוחות שלכם מעלים. המודלים החדשים שיש בשירותי הענן השונים הם באמת חזקים וזולים. אפשר להוריד את העלות באמצעות מודל משלכם כמובן, אבל לפעמים אפשר לספוג את העלות ולהרוויח את הפשטות הרבה.

פוסטים נוספים שכדאי לקרוא

פיתוח ב-JavaScript

Axios interceptors

תכנון נכון של קריאות AJAX באפליקציה ריאקטית וניהול השגיאות או ההצלחות עם פיצ׳ר נחמד של axios

פתרונות ומאמרים על פיתוח אינטרנט

עבודה עם GPT למתכנתים

אני עובד עם GPT כמה חודשים טובים באופן צמוד. הוא כלי חזק וכדאי ממש להשתמש בו, אבל יש לו גם חסרונות ומגבלות שכדאי להכיר.

תמונה מצוירת של רובוט שמנקה HTML
יסודות בתכנות

סניטציה – למה זה חשוב

הסבר על טכניקה פשוטה וידועה מאד שאנו מפעילים על מידע לפני שאנחנו מציגים אותו ב-HTML באפליקציה או באתר.

גלילה לראש העמוד