none
שרת wcf שמקשיב רק למחשבים מסוימים RRS feed

  • שאלה

  • איך אפשר לעשות שרת wcf שמקבל בקשות רק ממחשבים מסוימים (לפי ip) כשהip שלהם ידוע לי?

    תודה רבה


    • נערך על-ידי 1234ctk יום שלישי 22 דצמבר 2015 09:54
    יום שלישי 22 דצמבר 2015 09:52

תשובות

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

    הנה כמה דוגמאות מעשיות לנקודות שהסכרתי מעל:

    >> כאמור המימוש הראשון הוא פשוט ברמת האפליקציה לבדוק מה ה I של הלקוח ולקבוע מה יחזור אליו. באפליקציות WEB אפשר לבצע את זה בקלות בעזרת:
    HttpContext.Current.Request.UserHostAddress
    * בשירות WCF כדי לממש את זה צריך לבצע הפעלה של AspNetCompatibility mode
    https://msdn.microsoft.com/en-us/library/ms731336(v=vs.110).aspx
    לאחר הגדרות אלו אפשר במחלקה שלנו לעשות שימוש במאפיין המתאים למשל כך:

    namespace WcfService1
    {
        // You must add the following atribute to your service class
        [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
        public class Service1 : IService1
        {....

    * לשימוש AspNetCompatibility יש הרבה מימושים. זה מאפשר לנו בשירות WCF לעשות שימוש בכוח של asp.net אבל מצד שני מגביל אותנו בפרוטוקולים למשל.

    >> יש אפשרות נוספת שניתן לממש בקלות: בעזרת המחלקה OperationContext והמתודה של IncomingMessageProperties אפשר להגיע לכל המאפיינים של הלקוח שפנה אל השירות שלנו. משהו בערך ככה:

    OperationContext MyContext = OperationContext.Current;
    MessageProperties MyProp = MyContext.IncomingMessageProperties;
    RemoteEndpointMessageProperty MyEndpoint = MyProp[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
    string ip = MyEndpoint.Address;

    * אפשרות זו לא מכניסה לנו את המגבלות של האפשרות הקודמת של קביעת ה AspNetCompatibility.** אני מציע לחפש עוד חומר על נושא זה באינטרנט.

    >> מימוש ברמת ה Web.config באפליקציות אינטרנט, נעשה בעזרת הוספת מקטע של ipSecurity
    https://www.stokia.com/support/misc/web-config-ip-address-restriction.aspx

    בקישור הבא יש מימוש מעט יותר מורכב באותה רמה של קובץ הקונפיגורציה. מצד אחד זה קצת כמו להמציא את הגלגל, אבל זנ לא נכון ומצד שני זה הרבה יותר גמיש ומתאים ל WCF שאמור לתת שירותים במגוון של פרוטוקולים ולא רק ב REST.
    http://stackoverflow.com/questions/722008/can-i-setup-an-ip-filter-for-a-wcf-service/803813#803813

    >> עוד אפשרות ברמת האפליקציה זה לעבוד בעזרת ה Message Filters המובנה.
    https://msdn.microsoft.com/en-us/library/ee517424(v=vs.110).aspx

    >> דרך מאוד יעילה לשירותי אינטרנט היא כאמור חסימה ברמת ה IIS (אני מאוד אוהב את זה מכיוון שאני נעזר בכך כדי לחסום לא רק שירות WCF אלא גם גלישה לאתרים מסויימים ממדינות עויינות למשל או ממדינות כמו סין וקוריאה שיש משם המון נסיונות פריצה לשרתים...)
    http://www.iis.net/learn/get-started/whats-new-in-iis-8/iis-80-dynamic-ip-address-restrictions
    https://technet.microsoft.com/en-us/library/cc733090(v=ws.10).aspx

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

    >> אני יכול להמשיך עוד הרבה... כמו שאמרתי יש כמעט איןסוף אפשרויות שונות לחלוטין בגישה ו/או במימוש :-)

    אני רוצה לסיים עם מדריך קטן מאוד מומלץ לדעתי, שכדאי לשמור. הוא כולל דוגמה למימוש ברמת השירות והסבר של צעד אחרי צעד:
    http://www.codeproject.com/Articles/37280/WCF-Service-Behavior-Example-IPFilter-Allow-Deny-A


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]    [Linkedin]

    • סומן כתשובה על-ידי 1234ctk יום רביעי 23 דצמבר 2015 13:11
    יום שלישי 22 דצמבר 2015 15:41
    מנחה דיון

כל התגובות

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

    הנה כמה דוגמאות מעשיות לנקודות שהסכרתי מעל:

    >> כאמור המימוש הראשון הוא פשוט ברמת האפליקציה לבדוק מה ה I של הלקוח ולקבוע מה יחזור אליו. באפליקציות WEB אפשר לבצע את זה בקלות בעזרת:
    HttpContext.Current.Request.UserHostAddress
    * בשירות WCF כדי לממש את זה צריך לבצע הפעלה של AspNetCompatibility mode
    https://msdn.microsoft.com/en-us/library/ms731336(v=vs.110).aspx
    לאחר הגדרות אלו אפשר במחלקה שלנו לעשות שימוש במאפיין המתאים למשל כך:

    namespace WcfService1
    {
        // You must add the following atribute to your service class
        [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
        public class Service1 : IService1
        {....

    * לשימוש AspNetCompatibility יש הרבה מימושים. זה מאפשר לנו בשירות WCF לעשות שימוש בכוח של asp.net אבל מצד שני מגביל אותנו בפרוטוקולים למשל.

    >> יש אפשרות נוספת שניתן לממש בקלות: בעזרת המחלקה OperationContext והמתודה של IncomingMessageProperties אפשר להגיע לכל המאפיינים של הלקוח שפנה אל השירות שלנו. משהו בערך ככה:

    OperationContext MyContext = OperationContext.Current;
    MessageProperties MyProp = MyContext.IncomingMessageProperties;
    RemoteEndpointMessageProperty MyEndpoint = MyProp[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
    string ip = MyEndpoint.Address;

    * אפשרות זו לא מכניסה לנו את המגבלות של האפשרות הקודמת של קביעת ה AspNetCompatibility.** אני מציע לחפש עוד חומר על נושא זה באינטרנט.

    >> מימוש ברמת ה Web.config באפליקציות אינטרנט, נעשה בעזרת הוספת מקטע של ipSecurity
    https://www.stokia.com/support/misc/web-config-ip-address-restriction.aspx

    בקישור הבא יש מימוש מעט יותר מורכב באותה רמה של קובץ הקונפיגורציה. מצד אחד זה קצת כמו להמציא את הגלגל, אבל זנ לא נכון ומצד שני זה הרבה יותר גמיש ומתאים ל WCF שאמור לתת שירותים במגוון של פרוטוקולים ולא רק ב REST.
    http://stackoverflow.com/questions/722008/can-i-setup-an-ip-filter-for-a-wcf-service/803813#803813

    >> עוד אפשרות ברמת האפליקציה זה לעבוד בעזרת ה Message Filters המובנה.
    https://msdn.microsoft.com/en-us/library/ee517424(v=vs.110).aspx

    >> דרך מאוד יעילה לשירותי אינטרנט היא כאמור חסימה ברמת ה IIS (אני מאוד אוהב את זה מכיוון שאני נעזר בכך כדי לחסום לא רק שירות WCF אלא גם גלישה לאתרים מסויימים ממדינות עויינות למשל או ממדינות כמו סין וקוריאה שיש משם המון נסיונות פריצה לשרתים...)
    http://www.iis.net/learn/get-started/whats-new-in-iis-8/iis-80-dynamic-ip-address-restrictions
    https://technet.microsoft.com/en-us/library/cc733090(v=ws.10).aspx

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

    >> אני יכול להמשיך עוד הרבה... כמו שאמרתי יש כמעט איןסוף אפשרויות שונות לחלוטין בגישה ו/או במימוש :-)

    אני רוצה לסיים עם מדריך קטן מאוד מומלץ לדעתי, שכדאי לשמור. הוא כולל דוגמה למימוש ברמת השירות והסבר של צעד אחרי צעד:
    http://www.codeproject.com/Articles/37280/WCF-Service-Behavior-Example-IPFilter-Allow-Deny-A


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]    [Linkedin]

    • סומן כתשובה על-ידי 1234ctk יום רביעי 23 דצמבר 2015 13:11
    יום שלישי 22 דצמבר 2015 15:41
    מנחה דיון
  •  תודה רבה-ההסבר שלך עזר לי המון והצלחתי לעשות את זה 
    יום רביעי 23 דצמבר 2015 13:18
  • בכיף :-)
    אני שמח שזה עזר

    מעניין, באיזה מהאפשרויות בחרת בסוף?


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]    [Linkedin]

    יום רביעי 23 דצמבר 2015 17:07
    מנחה דיון
  • באפשרות הזו:

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

    http://stackoverflow.com/questions/722008/can-i-setup-an-ip-filter-for-a-wcf-service/803813#803813

    לקח לי קצת זמן להבין איך עושים ומה-אבל בסוף הצלחתי:)

    יום רביעי 23 דצמבר 2015 21:33
  • יפה !

    אפשר לאתגר אותך קצת?!?

    עתה כאשר יש לך את הפתרון, אולי תכתבי בלוג נחמד על הבעיה שלך והפתרון במצאת בצורה מדוייקמת עם קודים והסברים?
    אם תכתבי משהו נחמד אני אפרסם את זה בבלוגים שלי כבלוג אורח :-)

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

    * אם תכתבי בלוג טוב בעברית אז בשלב השני נוכל לתרגם אותו לאנגלית ולפרסם אותו גם באתר של מייקרוסופט. זה דרך מעולה לתרום לקהילה ולכינס לנעליים של מומחי המיחשוב... ככה מתחילים... כותבים בלוג על מקרה אמיתי וממשיגכים משם :-)


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]    [Linkedin]


    יום שישי 25 דצמבר 2015 15:45
    מנחה דיון
  • בסדר אני אנסה
    יום ראשון 27 דצמבר 2015 07:44
  • תודיעי לי אם משהו מתחיל להתבשל :-)
    גם אם התחלת ואת נתקעת אני אשמח לעזור

    בינתיים את מוזמנת לקחת חלק בפעילות של קהילות ה TechNet WIKI של מייקרוסופט. שם תוכלי למצוא את כל כותבי המאמרים באתר של מייקרוסופט (מייקרוסופט העולמית הכוונה ולא בישראל). אני מקווה להוסיף לשם את מה שאת תכתבי, אחרי שנתרגם אותו לאנגלית :-)

    זה הקישור לקבוצה הרשמית של מייקרוסופט:
    https://www.facebook.com/groups/TechNetWikiNinjas/

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


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]    [Linkedin]

    יום שני 28 דצמבר 2015 07:23
    מנחה דיון