שאלה כיצד להפעיל שרת ביציאה 80 כמשתמש רגיל ב- Linux?


יש לי googled על זה במשך זמן לא רב, אבל לא הצלחתי למצוא אותו.

אני על אובונטו לינוקס ורוצה להפעיל שרת ביציאה 80, אבל בגלל מנגנון האבטחה של אובונטו, אני מקבל את השגיאה הבאה:

java.net.BindException: הרשאה נדחתה: 80

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


282
2017-11-10 14:31




מה הבעיה להפעלת השרת ביציאה אחרת שאינה מוצדקת? אתה חושב על משהו קשה כמו השבתת מנגנון האבטחה מבלי לספק לפחות סיבה רצינית מאוד להפעלת שרת על הנמל. האם השרת hardcoded לאגד את יציאת 80? אם כן, לזרוק אותו. - Anonymous
או הודעת שגיאה של Python: socket.error: [Errno 13] Permission denied - Kazark
שכפול אפשרי של משתמש רגיל המשתמש ביציאות מתחת ל 1024 - Roman
אתה לא יכול. יציאות מתחת ל 1024 הן חסויות, ורק שורש יכול לפתוח שקעי הקשבה עליהן. הדבר הנכון לעשות הוא לשחרר הרשאות לאחר פתיחתו. - Falcon Momot
"אנונימי" - המשתמשים בעולם הוכשרו לחפש שירותים מסוימים בנמלים מסוימים. במקרים מסוימים, שלו היה סטנדרטי. לדוגמה, HTTP ביציאה 80 ו- HTTPS ביציאה 443. זה סוג של קשה לשנות את המשתמשים ואת הסטנדרטים של העולם. - jww


תשובות:


תשובה קצרה: אתה לא יכול. יציאות מתחת 1024 ניתן לפתוח רק על ידי השורש. לפי הערה - טוב, אתה יכול, באמצעות CAP_NET_BIND_SERVICE, אבל גישה זו, להחיל על ג 'אווה bin תעשה כל תוכנית ג' אווה להיות לרוץ עם הגדרה זו, וזה לא רצוי, אם לא סיכון אבטחה.

התשובה הארוכה: ניתן לנתב מחדש חיבורים ביציאה 80 ליציאה אחרת שתוכל לפתוח כמשתמש רגיל.

הפעל כשורש:

# iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

כמו התקני loopback (כמו localhost) לא להשתמש בכללים prerouting, אם אתה צריך להשתמש localhost, וכו ', להוסיף את הכלל הזה גם כן (תודה @ פרנצ'סקו)

# iptables -t nat -I OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j REDIRECT --to-ports 8080

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

עריכה: לפי השאלה הערה - למחוק את הכלל הנ"ל:

# iptables -t nat --line-numbers -n -L

זה יהיה פלט משהו כמו:

Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination         
1    REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:8080 redir ports 8088
2    REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80 redir ports 8080

הכלל שאתה מעוניין הוא nr. 2, כדי למחוק אותו:

# iptables -t nat -D PREROUTING 2

331
2017-11-10 14:41



@Sunny: upvotes אינם עבור האקדח המהיר במערב, אבל עבור התגובות הטובות ביותר. שלך הוא הטוב ביותר עד כה (אני רק הזכיר iptables, אתה בעצם סיפק את שורת הפקודה המלא). הדבר היחיד שלי יש שלך הוא לא אזהרה לגבי משתמשים אחרים גם להיות מסוגל לאגד לנמל 8080. - CesarB
שים לב שזה לא עובד עם IPv6. - Emmanuel Bourg
האם מישהו יכול להסביר כיצד אוכל להסיר את הכלל במועד מאוחר יותר, כאשר אני רוצה? אחרי זה פועל, זה עובד, אבל זה כנראה לא "כלל" כי זה לא מופיע כאשר אני עושה sudo iptables --list. אני יודע מה iptables הוא ועושה, אבל אני אף פעם לא ממש השתמש בו לפני זה. - Encoderer
תודה על תשובתך ... בכל פעם שאני מחדש את אובונטו, הכלל הזה נעלם ואני צריך להפעיל אותו שוב. האם יש דרך לשמור את זה לנצח? - Coderji
@Coderji: בדוק את הקטע "שמור" בתיעוד הקהילתי: help.ubuntu.com/community/IptablesHowTo - Sunny


להשתמש authbind.

זה אפילו עובד עם ג 'אווה אם אתה מפעיל את ג' אווה של IPv4 בלבד מחסנית. אני משתמש:

authbind --deep $JAVA_HOME/bin/java -Djava.net.preferIPv4Stack=true …

77
2017-11-14 13:12



אם השרת הוא Tomcat אתה יכול להשתמש authbind באופן אוטומטי על ידי הגדרה AUTHBIND=yes in / etc / default / tomcat6 - Emmanuel Bourg
אני לא יכול לקבל את זה לעבוד על שרת אובונטו עם ברירת המחדל של חבילת Java ... - Ashley Steel
אני לא, שום פתרון ידוע? - mark
שים לב שעליך להגדיר authbind כדי לאפשר לזה לקרות. מדף האיש: "/ etc / authbind / byport / port נבדק, אם קובץ זה נגיש לביצוע עבור המשתמש המתקשר, בהתאם לגישה (2), אזי מחייב ליציאה"., למשל עבור יציאה 80, sudo touch /etc/authbind/byport/80 ; sudo chmod 777 /etc/authbind/byport/80. ההתקנה הראשונית של authbind בדרך כלל אין הרשאות מוגדרות מראש. - Jason C
ללא שם: הו לא nononononono, לעולם לא אי פעם שום דבר! - Johannes


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

ב- Debian / Ubuntu חדש יותר תוכל להפעיל:

sudo apt-get install libcap2-bin 
sudo setcap 'cap_net_bind_service=+ep' /path/to/program

46
2018-05-30 20:32



זה עובד עבור nodejs: setcap 'cap_net_bind_service = + ep' / usr / bin / nodejs - JasonS
זה. אני תוהה מדוע אין לתשובה זו עוד תגובות. הרבה יותר קל מאשר את האפשרות iptables imho. - Dominik R
זו התשובה הנכונה והיעילה ביותר, כל התשובות האחרות גורמות להכות ביצועים או ליתר ביטחון. - OneOfOne


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

chown root ./myapp
chmod +S ./myapp

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

עדכון: כפי שנראה ב השאלה הזו, נראה כי לינוקס לינוקס מאז 2.6.24 יש יכולת חדשה המאפשרת לך לסמן הפעלה (אבל לא סקריפט, כמובן) כמו בעל "CAP_NET_BIND_SERVICE"אם אתה מתקין את החבילה debian" libcap2-bin ", אתה יכול לעשות זאת על ידי הנפקת הפקודה

setcap 'cap_net_bind_service=+ep' /path/to/program

39
2017-11-10 14:44



זה אותו הדבר כמו לרוץ כמו שורש, אלא אם כן App יודע איך לשחרר priviledges. - CesarB
זה מסוכן. משמעות הדבר היא כי כל בקשה תפעל כמו שורש. זה מסיבה שאפילו אפאצ 'י מתחיל כמו שורש כדי לאגד, ולאחר מכן טיפות הרשאות למשתמש אחר. - Sunny
פול: iptables הוא לא כל כך מסוכן, כי גם אם האפליקציה נפגעת, זה לא יחשוף את המערכת על התקפות, לפחות לא עם הרשאות שורש. הפעלת האפליקציה כשורש היא סיפור אחר. - Sunny
הסכנה של iptables היא רק אם זוהי מערכת מרובת משתמשים, כפי שאמר CesarB, כמו כל אחד יכול לאגד 8080, וליירט את התנועה. - Sunny
חחח, אוהב איך התשובה המקובלת יש -15 - Evan Teran


הגישה המוצעת על ידי סאני ו CesarB:

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

עובד בסדר אבל יש לו חסרון קטן - זה לא מונע ממשתמש להתחבר ישירות ליציאה 8080 במקום 80.

חשוב על התרחיש הבא כאשר בעיה זו עלולה להיות בעיה.

נניח שיש לנו שרת המקבל חיבורי HTTP ביציאות 8080 ו- HTTPS ביציאה 8181.

אנו משתמשים ב- iptables כדי ליצור את ההפניות הבאות:

80  ---> 8080
443 ---> 8181

כעת, נניח שהשרת שלנו מחליט לנתב מחדש משתמש מדף HTTP לדף HTTPS. אם לא נכתוב מחדש את התגובה, היא תעביר אותה מחדש https://host:8181/. בשלב זה, אנחנו דפוקים:

  • משתמשים מסוימים היו סימניה את https://host:8181/ כתובת האתר ואנחנו צריכים לשמור על כתובת אתר זו כדי למנוע את הפרת הסימניות.
  • משתמשים אחרים לא יוכלו להתחבר משום שרתי ה- proxy שלהם אינם תומכים ביציאות SSL לא סטנדרטיות.

אני משתמש בגישה הבאה:

iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p tcp --dport 443 -j MARK --set-mark 1
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8181
iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -m mark --mark 1 -j ACCEPT
iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport 8181 -m mark --mark 1 -j ACCEPT

בשילוב עם ברירת המחדל של כלל REJECT בשרשרת INPUT גישה זו מונעת ממשתמשים להתחבר ישירות ליציאות 8080, 8181


35
2018-02-20 16:19



זה טוב, אבל למה לא פשוט לקשור את הדמון כדי localhost: 8080 במקום 0.0.0.0:8080? אני רוצה לעשות את זה, אבל אני צריך את זה iptables. - Amala
זה עובד, ממש מגניב. - xtian


אני פשוט משתמש Nginx מלפנים. זה יכול לפעול על localhost מדי.

  • apt-get install nginx

.. או ..

  • pkg_add -r nginx 

.. או מה בכלל מתאים למערכת ההפעלה שלך.

כל מה שאתה צריך nginx.conf, אם פועל על localhost, הוא:

שרת {
        תקשיב 80;
        server_name some.domain.org;
        מקום / {
            proxy_set_header מארח מארח $;
            proxy_set_header X-Real-IP $ remote_addr;
            proxy_set_header X-Forwarded-for $ proxy_add_x_forwarded_for;
            proxy_pass http://127.0.0.1:8081;
        }
}

35
2017-11-20 14:30



אני באמת אוהב את הפתרון הזה. - thomasfedb
זהו (אחד) הפתרון המוצע JFrog עצמם: jfrog.com/confluence/display/RTF/nginx - stolsvik


באופן מסורתי על יוניקס, רק שורש יכול לקשור יציאות נמוכות (<1024).

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


29
2017-11-10 14:36





אם המערכת תומכת בכך, תוכל להשתמש ביכולות. ראה man capabilities, אחד שאתה צריך יהיה CAP_NET_BIND_SERVICE. לא, אני מעולם לא השתמשתי בהם בעצמי ואני לא יודע אם הם באמת עובדים :-)


23
2017-11-10 16:27



הם עושים עבודה, אני משתמש CAP_NET_RAW להפעיל כלים כמו tcpdump כמשתמש רגיל. - Justin


השתמש proxy הפוך (nginx, apache + mod_proxy) או במטמון הפוך פרוקסי (דיונון, לכה) מול שרתי היישומים שלך!

עם proxy הפוך אתה יכול להשיג הרבה דברים מעניינים כמו:

  • איזון עומסים
  • הפעלה מחדש של שרתי היישומים שלך עם משתמשים המקבלים דף שגיאה מפואר
  • להאיץ את המצב עם מטמון
  • הגדרות בסדר גרגיר שאתה עושה בדרך כלל עם proxy הפוכה ולא עם שרת היישומים

11
2017-10-18 15:36