במאמר הזה מוסבר איך להשתמש ברשימות של בקרת גישה (ACL) של Apache Kafka כדי לשלוט בגישה בשירות המנוהל של Google Cloud ל-Apache Kafka.
רשימות בקרת גישה (ACL) של Apache Kafka מספקות בקרת גישה פרטנית באשכול Kafka. השירות המנוהל ל-Apache Kafka מאפשר להשתמש ב-StandardAuthorizer, שמאחסן את רשימות בקרת הגישה במטא-נתונים של אשכול Kafka שמבוסס על KRaft.
רשימות בקרת הגישה האלה קובעות אילו משתמשים מאומתים יכולים לבצע פעולות ספציפיות במשאבי Kafka ספציפיים, כמו יצירה או צריכה של הודעות בנושא מסוים.
רשימות בקרת הגישה האלה שימושיות לשליטה באינטראקציות עם האשכול באמצעות לקוחות רגילים של Apache Kafka, שחלים עליהם רק בדיקת IAM ברמת האשכול לחיבור הראשוני. מידע נוסף מופיע במאמר בקרת גישה באמצעות IAM.
איך פועלת בקרת הגישה של רשימות ACL ב-Kafka
הלקוח יוצר אינטראקציה עם מנגנון ההרשאה של רשימת בקרת הגישה (ACL) הרגילה של Kafka באשכול. המאשר מעריך את רשימות ה-ACL הרלוונטיות של Apache Kafka כדי לאשר פעולות ספציפיות שהגורם המורשה מבקש לבצע, כמו יצירת נושא או צריכה מקבוצה. המשתמש שמשמש לבדיקת ה-ACL נגזר מאחת משיטות האימות הבאות:
SASL: הישות המורשית ב-IAM, כמו כתובת האימייל בחשבון שירות.
mTLS: השם הייחודי (DN) מאישור הלקוח, שעבר שינוי פוטנציאלי על ידי כללי מיפוי של ישויות.
כדי להבטיח אבטחה מקיפה, צריך להגדיר את הדברים הבאים:
הרשאות IAM לגישת ניהול. מידע נוסף מופיע במאמר בקרת גישה באמצעות IAM.
רשימות בקרת גישה (ACL) של Kafka לגישה לנתונים ולפעולות בתוך האשכול מלקוחות קוד פתוח של Apache Kafka, ללא קשר לשיטת האימות.
שימוש ברשימות ACL של Apache Kafka
קישורי ACL של Apache Kafka מופיעים בפורמט הבא:
Principal P is [Allowed/Denied] Operation O From Host H on any resource matching Resource Pattern RP.
בהמשך מפורט מידע חשוב על הפורמט:
הגורם המורשה(P): זהות המשתמש שמקבל הרשאה. הקידומת של השדה הזה היא
User:.באימות SASL, זהו חשבון הראשי ב-IAM, כמו
User:my-service-account@my-project.iam.gserviceaccount.com.באימות mTLS, זהו השם הייחודי (DN) מאישור הלקוח, כמו
User:CN=my-client,OU=my-org-unit. הפורמט המדויק תלוי בנושא של האישור. כללי מיפוי של ישויות יכולים לשנות את הערך הזה.
סוג ההרשאה(מאושרת/נדחית): האם הקישור של רשימת ה-ACL מאפשר או דוחה גישה. קישורי דחייה מקבלים עדיפות.
פעולה(O): הפעולה שבוצעה, כמו קריאה, כתיבה או יצירה. מידע על הפעולות שחלות על משאבים שונים בפרוטוקולים שונים של Kafka זמין במאמר Operations and Resources on Protocols (פעולות ומשאבים בפרוטוקולים) במסמכי התיעוד של Apache Kafka.
מארח(H): המכונה שממנה מגיעה הבקשה. מכיוון שהשירות המנוהל ל-Apache Kafka מתרגם כתובות רשת של לקוחות, השימוש במארחים שאינם
'*'לא נתמך.תבנית משאב(RP): תבנית שמשמשת להתאמה של משאבים ספציפיים. תבנית משאב מורכבת מסוג משאב, שם משאב וסוג תבנית (
LITERALאוPREFIXED).
הרשאות גישה המוגדרות כברירת מחדל
אשכולות של שירות מנוהל ל-Apache Kafka פועלים עם המאפיין Apache Kafka
allow.everyone.if.no.acl.found שמוגדר ל-true. הנוכחות או היעדר של רשימות ACL ב-Kafka קובעות ישירות את רמת הגישה למשאבים:
אם לא מוגדרות רשימות ACL של Kafka למשאב ספציפי כמו נושא, כל החשבונות המאומתים מקבלים גישה אליו. ההגדרה הזו מאפשרת להפעיל מיד אשכולות של שירות מנוהל ל-Apache Kafka, בלי שצריך להגדיר ACL.
ברגע שמגדירים ACL של Kafka למשאב, הגישה אליו מוגבלת. רק לחשבונות משתמשים שקיבלו הרשאה מפורשת באמצעות רשומה ב-ACL של Kafka יש גישה למשאבים תואמים (אלא אם הם נחסמו באופן ספציפי על ידי רשומה ב-ACL של
DENY).ALLOW
השירות המנוהל ל-Apache Kafka מעניק לסוכן השירות שלו גישת אדמין לאשכול. הגישה הזו מאפשרת לסוכן השירות לבצע פעולות שמתבקשות על ידי שירות מנוהל ל-Apache Kafka API, ללא קשר לרשימות בקרת גישה אחרות שהוגדרו באשכול. שירות מנוהל ל-Apache Kafka עושה זאת על ידי שינוי ההטמעה של StandardAuthorizer. השינוי מעניק לסוכן השירות הרשאות דומות לאלה של משתמשי-על, מלבד פעולות קריאה וכתיבה. אי אפשר לשנות את ההגדרה הזו.
Kafka principals
חשבונות המשתמשים ב-Kafka באשכולות של שירות מנוהל ל-Apache Kafka מצוינים עם הקידומת "User:" של Kafka StandardAuthorizer.
ב-SASL/IAM: החשבון הראשי הוא חשבוןGoogle Cloud . לדוגמה, כדי להעניק גישה לחשבון השירות
test-kafka-client@test-project.iam.gserviceaccount.com, משתמשים בחשבון המשתמש של Kafka"User:test-kafka-client@test-project.iam.gserviceaccount.com". בחשבונות ראשיים של ACL ב-Kafka צריך לציין משתמש, חשבון שירות או חשבון ראשי נפרד ב-IAM, אבל לא קבוצה או קבוצת חשבונות ראשיים. Kafka ACLs לא תומך בפתרון של חברויות בקבוצות עבור Google Cloud principals.ב-mTLS: העיקרון נגזר מהשם המובחן (DN) של הנושא באישור הלקוח. לדוגמה,
User:CN=client1,OU=dev,O=MyOrg,L=City,ST=State,C=US. אתם יכולים להשתמש בכללי מיפוי של עקרונות mTLS כדי להמיר את ה-DN למחרוזת עקרונות ידידותית יותר למשתמש עבור ACL.
כדי ליצור ACL שחל על כל החברים בקבוצת Google או על קבוצת משתמשים, אפשר להשתמש ביישות של חשבון שירות ל-proxy ובהתחזות לחשבון שירות:
יוצרים חשבון שירות לשימוש כפרוקסי לקבוצה.
מקצים לקבוצת Google או לקבוצת החשבונות את התפקיד 'יצירת אסימונים בחשבון שירות' בחשבון השירות. ניהול הגישה לחשבונות שירות
מוסיפים רשימות בקרת גישה (ACL) של Kafka לחשבון השירות של ה-proxy. דוגמה לישות ראשית:
User:group-proxy@test-project.iam.gserviceaccount.com.משתמשים בהתחזות לחשבון שירות בלקוחות Kafka כדי לבצע אימות ל-Kafka בתור חשבון השירות. Google Cloud מערכת IAM מאשרת לחשבון משתמש ספציפי להיות חבר בקבוצה שמורשית להתחזות לחשבון השירות של ה-proxy. ו-Kafka מאשר את חשבון השירות של ה-proxy מול רשימות בקרת הגישה (ACL) הקיימות באשכול.
פעולות Kafka עבור צרכנים ומפיקים
פעולה היא פעולה שמבוצעת במשאב. לכל משאב, פעולה ממופה לבקשה אחת או יותר של פרוטוקול Kafka עבור אותו משאב.
לדוגמה, פעולת READ עבור סוג המשאב topic ממופה לפרוטוקולים Fetch, OffsetCommit ו-TxnOffsetCommit של Apache Kafka.
כדי לתת לחשבון ראשי הרשאת הפקה בנושא, מבצעים את השלבים הבאים:
במשאב הנושא, מאשרים את הפעולות
WRITEו-CREATE.אם משתמשים במזהי עסקאות, במשאב של מזהה העסקה צריך לאפשר את הפעולה
WRITE.
כדי להעניק לחשבון משתמש גישת צריכה לנושא, מבצעים את השלבים הבאים:
במשאב הנושא, מאשרים את הפעולה
READ.במשאב של קבוצת הצרכנים, מאשרים את הפעולה
READ.
מידע נוסף על הפעולות התקפות במשאבים ש-Kafka API תומך בהן זמין במאמר Operations and Resources on Protocols במסמכי Apache Kafka.
הגדרת רשימות ACL להתנהגות של דחייה כברירת מחדל
אשכולות מנוהלים של Kafka מוגדרים עם allow.everyone.if.no.acl.found = true.
לכן, כברירת מחדל, אם לא מוגדרות רשימות ACL במשאב, לכל החשבונות יש גישה למשאב.
כדי להגדיר התנהגות של default-deny שדומה לזו של IAM, אפשר קודם להגדיר גישה למשתמש אדמין לכל המשאבים באשכול.
כתוצאה מכך, לכל משאב מוגדר ACL, וההתנהגות של allow.everyone.if.no.acl.found מבוטלת.
כברירת מחדל, לכל חשבון משתמש שלא קיבל הרשאה מפורשת מרשימת ACL של ALLOW, הגישה נדחית.
לדוגמה, כדי להגדיר רשימות ACL לכל המשאבים באשכול עבור חשבון השירות clusterAdmin@test-project.iam.gserviceaccount.com, יוצרים את רשומות ה-ACL הבאות.
הפקודה הבאה של ה-CLI של gcloud מעניקה לחשבון שירות בשם clusterAdmin@test-project.iam.gserviceaccount.com גישת אדמין מלאה (--operation=ALL) לאשכול Kafka ספציפי שנמצא באזור מסוים. ההרשאה הזו מאפשרת לחשבון השירות לבצע כל פעולה באשכול מכל מארח.
gcloud managed-kafka acls add-acl-entry cluster \
--principal=`User:clusterAdmin@test-project.iam.gserviceaccount.com` \
--operation=ALL \
--permission-type=ALLOW \
--host=* \
--cluster=CLUSTER_ID \
--location=LOCATION
הפקודה הבאה ב-CLI של gcloud מעניקה לחשבון שירות בשם clusterAdmin@test-project.iam.gserviceaccount.com גישת אדמין מלאה (--operation=ALL) לכל הנושאים באשכול Kafka ספציפי שנמצא באזור מסוים. ההרשאה הזו מאפשרת לחשבון השירות לבצע כל פעולה בכל הנושאים מכל מארח.
gcloud managed-kafka acls add-acl-entry allTopics \
--principal=`User:clusterAdmin@test-project.iam.gserviceaccount.com` \
--operation=ALL \
--permission-type=ALLOW \
--host=* \
--cluster=CLUSTER_ID \
--location=LOCATION
הפקודה הבאה של ה-CLI של gcloud מעניקה לחשבון שירות בשם clusterAdmin@test-project.iam.gserviceaccount.com הרשאת אדמין מלאה (--operation=ALL) לכל קבוצות הצרכנים באשכול Kafka ספציפי שנמצא באזור מסוים. ההרשאה הזו מאפשרת לחשבון השירות לבצע כל פעולה בכל קבוצות הצרכנים מכל מארח.
gcloud managed-kafka acls add-acl-entry allConsumerGroups \
--principal=`User:clusterAdmin@test-project.iam.gserviceaccount.com` \
--operation=ALL \
--permission-type=ALLOW \
--host=* \
--cluster=CLUSTER_ID \
--location=LOCATION
הפקודה הבאה ב-CLI של gcloud מעניקה לחשבון שירות בשם clusterAdmin@test-project.iam.gserviceaccount.com גישת אדמין מלאה (--operation=ALL) לכל מזהי העסקאות באשכול Kafka ספציפי שנמצא באזור מסוים. ההרשאה הזו מאפשרת לחשבון השירות לבצע כל פעולה על כל מזהי העסקאות מכל מארח.
gcloud managed-kafka acls add-acl-entry allTransactionalIds \
--principal=`User:clusterAdmin@test-project.iam.gserviceaccount.com` \
--operation=ALL \
--permission-type=ALLOW \
--host=* \
--cluster=CLUSTER_ID \
--location=LOCATION
בהמשך מופיעה רשימה של פרטים חשובים על הפקודות:
--principal='User:test-kafka-client@test-project.iam.gserviceaccount.com': חשבון המשתמש שעליו חלה רשימת ה-ACL. החשבון הראשי הוא חשבוןGoogle Cloud , עם הקידומתUser:של Kafka StandardAuthorizer.
--operation=all: פעולת Kafka שניתנת, שהיא גישה מלאה במקרה הזה.
--permission-type=ALLOW: רשומת ה-ACL הזו מעניקה גישה.
--host='*': המארח שממנו לחשבון המשתמש יש גישה למשאב.'*'מאפשרת גישה מכל מארח. שירות מנוהל ל-Apache Kafka תומך רק ב-ACL עם מארח'*'.CLUSTER_ID: השם של האשכול שלכם בשירות המנוהל ל-Apache Kafka.
LOCATION: האזור שבו נמצא האשכול שלכם בשירות המנוהל ל-Apache Kafka, כמו
us-central1. Google Cloud
הגדרת רשימות ACL
אפשר להגדיר ACL ב-Apache Kafka באמצעות ממשקי ה-API של ACL בשירות המנוהל ל-Apache Kafka, או באמצעות כלים של Apache Kafka בקוד פתוח, כמו Apache Kafka authorizer cli kafka-acls.sh או Admin Client.
שירות מנוהל ל-Apache Kafka מארגן את רשימות בקרת הגישה לפי דפוסי משאבים של Kafka. דפוס המשאב מוגדר לפי:
סוג המשאב: אשכול, נושא, קבוצת צרכנים או מזהה טרנזקציה
סוג התבנית: מילולי או עם קידומת (כל המשאבים שהשם שלהם מתחיל במחרוזת שצוינה)
שם המשאב: שם המשאב או הקידומת שעליהם חלות רשומות ה-ACL.
משאב ACL של שירות מנוהל ל-Apache Kafka מייצג את כל בקרת הגישה שהוגדרה לתבנית משאב יחידה של Kafka, כרשימה חוזרת של רשומות ACL. השם של משאב ה-ACL מזהה באופן ייחודי את תבנית המשאב של קישור ה-ACL. מידע נוסף זמין במאמר מזהה ACL.
אפשר לנהל רשימות ACL של שירות מנוהל ל-Apache Kafka ברמת משאב ה-ACL (כל רשומות ה-ACL של תבנית משאב), או באופן מצטבר על ידי הוספה והסרה של רשומות ACL בודדות של תבנית משאב ACL.
מידע נוסף זמין במאמרים בנושא יצירה של רשימת ACL מנוהלת ב-Kafka והוספה של רשומה לרשימת ACL מנוהלת ב-Kafka.
מתן הרשאה לקריאה מתוך נושא
כדי לאפשר ללקוחות Apache Kafka בקוד פתוח שפועלים כחשבון השירות test-kafka-client@test-project.iam.gserviceaccount.com לקרוא מהנושא topic-name, יוצרים רשומה של רשימת בקרת גישה (ACL) בשירות מנוהל ל-Apache Kafka באמצעות הפקודה managed-kafka acls add-acl-entry:
gcloud managed-kafka acls add-acl-entry topic/topic-name \
--cluster=CLUSTER_ID \
--location=LOCATION
--principal='User:test-kafka-client@test-project.iam.gserviceaccount.com' \
--operation=READ \
--permission-type=ALLOW \
--host='*'
בהמשך מפורט מידע חשוב על הפקודה:
topic/topic-name: מציין את הנושא בשירות המנוהל ל-Apache Kafka שרוצים לתת לו גישה. מחליפים אתtopic-nameבשם הנושא בפועל. הקידומתtopic/מציינת שהרשומה הזו ברשימת ה-ACL חלה על תבנית משאב ספציפית (מילולית) של נושא.
LOCATION: האזור שבו נמצא האשכול שלכם בשירות המנוהל ל-Apache Kafka, לדוגמהus-central1. Google Cloud
CLUSTER_ID: השם של האשכול שלכם בשירות המנוהל ל-Apache Kafka.
--principal='User:test-kafka-client@test-project.iam.gserviceaccount.com': חשבון המשתמש שעליו חלה רשימת ה-ACL. החשבון הראשי הוא חשבוןGoogle Cloud , עם הקידומתUser:של Kafka StandardAuthorizer.
--operation=READ: פעולת Kafka שניתנת, שהיאREADבמקרה הזה.
--permission-type=ALLOW: מציין שרשומת ה-ACL הזו מעניקה גישה.
--host='*': מציין את המארח שממנו לחשבון המשתמש יש גישה למשאב.'*'מאפשרת גישה מכל מארח. שירות מנוהל ל-Apache Kafka תומך רק ב-ACL עם מארח'*'.
כדי להסיר את הרשאת הגישה לקריאה, אפשר להשתמש בפקודה remove-acl-entry עם אותם פרמטרים.
gcloud managed-kafka acls remove-acl-entry topic/topic-name \
--cluster=CLUSTER_ID \
--location=LOCATION
--principal='User:test-kafka-client@test-project.iam.gserviceaccount.com' \
--operation=READ \
--permission-type=ALLOW \
--host='*'
אפשר לכתוב לכל הנושאים עם קידומת משותפת
כדי לאפשר ללקוחות Apache Kafka בקוד פתוח שפועלים כחשבון השירות test-kafka-client@test-project.iam.gserviceaccount.com
לכתוב לכל הנושאים שהשם שלהם מתחיל בקידומת topic-prefix, מוסיפים רשומה של ACL מנוהל של Kafka באופן הבא:
gcloud managed-kafka acls add-acl-entry topicPrefixed/topic-prefix \
--cluster=CLUSTER_ID \
--location=LOCATION
--principal='User:test-kafka-client@test-project.iam.gserviceaccount.com' \
--operation=WRITE \
--permission-type=ALLOW \
--host='*'
בהמשך מפורט מידע חשוב על הפקודה:
topicPrefixed/topic-prefix: מציין את התבנית של משאב השירות המנוהל ל-Apache Kafka שרוצים להעניק לו גישה. מחליפים אתtopic-prefixבקידומת בפועל של הנושאים. הקידומתtopicPrefixed/מציינת שהרשומה הזו ברשימת ה-ACL חלה על תבנית של משאב עם קידומת: כל הנושאים שתואמים לקידומת שצוינה.
PROJECT: מזהה הפרויקט ב- Google Cloud שבו נמצא האשכול שלכם של שירות מנוהל ל-Apache Kafka.
LOCATION: האזור שבו נמצא האשכול שלכם בשירות המנוהל ל-Apache Kafka, לדוגמהus-central1. Google Cloud
CLUSTER_ID: השם של האשכול שלכם בשירות המנוהל ל-Apache Kafka.
--principal='User:test-kafka-client@test-project.iam.gserviceaccount.com': החשבון שה-ACL חל עליו. החשבון הראשי הוא חשבוןGoogle Cloud , עם הקידומתUser:של Kafka StandardAuthorizer.
--operation=WRITE: פעולת Kafka שניתנת, שהיאWRITEבמקרה הזה.
--permission-type=ALLOW: רשומת ה-ACL הזו מעניקה גישה.
--host='*': המארח שממנו לחשבון המשתמש יש גישה למשאב.'*'מאפשרת גישה מכל מארח. שירות מנוהל ל-Apache Kafka תומך רק ב-ACL עם מארח'*'.
כדי להסיר את הרשאת הכתיבה לחשבון השירות הזה, מסירים את הרשומה ב-ACL:
gcloud managed-kafka acls remove-acl-entry topicPrefixed/topic-prefix \
--cluster=CLUSTER_ID \
--location=LOCATION
--principal='User:test-kafka-client@test-project.iam.gserviceaccount.com' \
--operation=WRITE \
--permission-type=ALLOW \
--host='*'
דחיית בקשה לשינוי כל הנושאים
כדי למנוע מלקוחות Apache Kafka בקוד פתוח שפועלים כחשבון שירות test-kafka-client@test-project.iam.gserviceaccount.com לשנות את כל הנושאים באשכול, אפשר ליצור משאב ACL של שירות מנוהל ל-Apache Kafka עם רשימה של משאבים שמונעים את הפעולות ALTER, ALTER_CONFIGS ו-DELETE בכל הנושאים.AclEntry בגישה הזו, המצב הנדרש מוגדר בהגדרה אחת.
אפשרות אחרת היא להוסיף שלוש רשומות ACL נפרדות באמצעות הפקודה gcloud managed-kafka acls add-acl-entry.
בשיטה הזו מריצים את הפקודה כדי לדחות את הגישה לכל אחת מהפעולות ALTER, ALTER_CONFIGS ו-DELETE, באופן הבא:
gcloud managed-kafka acls add-acl-entry allTopics \
--cluster=CLUSTER_ID \
--location=LOCATION
--principal='User:test-kafka-client@test-project.iam.gserviceaccount.com' \
--operation=ALTER \
--permission-type=DENY \
--host='*'
gcloud managed-kafka acls add-acl-entry allTopics \
--cluster=CLUSTER_ID \
--location=LOCATION
--principal='User:test-kafka-client@test-project.iam.gserviceaccount.com' \
--operation=ALTER_CONFIGS \
--permission-type=DENY \
--host='*'
gcloud managed-kafka acls add-acl-entry allTopics \
--cluster=CLUSTER_ID \
--location=LOCATION
--principal='User:test-kafka-client@test-project.iam.gserviceaccount.com' \
--operation=DELETE \
--permission-type=DENY \
--host='*'
המידע הבא רלוונטי לכל אחת מהפקודות add-acl-entry:
allTopics: מציין שה-ACL הזה חל על כל הנושאים באשכול של שירות מנוהל ל-Apache Kafka.
LOCATION: האזור שבו נמצא האשכול שלכם בשירות המנוהל ל-Apache Kafka, למשלus-central1. Google Cloud
CLUSTER_ID: השם של האשכול שלכם בשירות המנוהל ל-Apache Kafka.
--principal='User:test-kafka-client@test-project.iam.gserviceaccount.com': מציין את חשבון המשתמש שעליו חלה רשימת ה-ACL. החשבון הראשי הוא חשבוןGoogle Cloud , עם הקידומתStandardAuthorizerשל KafkaUser:.
--operation: מציין את פעולת Kafka שנמנעת:
ALTER: כולל פעולות כמו שינוי מספר המחיצות או גורם השכפול.
ALTER_CONFIGS: כולל שינוי של הגדרות ברמת הנושא.
DELETE: כולל מחיקת נושאים.
--permission-type=DENY: מציין שרשומות ה-ACL האלה חוסמות גישה לפעולות שצוינו.
--host='*': מציין שהדחייה הזו חלה ללא קשר למארח שממנו מגיעה הבקשה. שירות מנוהל ל-Apache Kafka תומך רק ב-ACL עם מארח'*'.
כדי להסיר את ההגבלות האלה, משתמשים בפקודה remove-acl-entry לכל אחת מהרשומות שנוספו, עם אותם פרמטרים. לדוגמה, כדי לאפשר שוב מחיקת נושא:
gcloud managed-kafka acls remove-acl-entry allTopics \
--cluster=CLUSTER_ID \
--location=LOCATION
--principal='User:test-kafka-client@test-project.iam.gserviceaccount.com' \
--operation=DELETE \
--permission-type=DENY \
--host='*'
פתרון בעיות שקשורות לרשימות ACL
הכלי Apache Kafka Standard Authorizer כותב יומני ביקורת כברירת מחדל על דחיות הרשאה. אם אתם מקבלים שגיאת הרשאה של Kafka, אתם יכולים לאשר את החשבון הראשי, המשאב והפעולה שנדחו על ידי חיפוש StandardAuthorizerData logAuditMessage ביומני האשכול.
לדוגמה, הנה יומן של אשכול לדוגמה.
org.apache.kafka.metadata.authorizer.StandardAuthorizerData logAuditMessage\n
INFO: Principal = User:556291496362-compute@developer.iam.gserviceaccount.com is
Denied operation = DESCRIBE from host = 172.16.0.20 on resource = Topic:LITERAL:t1
for request = Metadata with resourceRefCount = 1 based on rule DefaultDeny