рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдореЗрд░реЗ рд╕рд░реНрд╡рд░ рдкрд░ gitlab рдФрд░ ssh рдХреЗ рд▓рд┐рдП рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рдЪрдпрди рдкрд░ рдПрдХ рд╣рдорд▓рд╛ рдПрдХ git рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд╕рд╛рде рдореЗрд░реЗ рд╕рд░реНрд╡рд░ рдкрд░ рд╢реБрд░реВ рд╣реБрдЖред рд╣рдорд▓рд╛рд╡рд░реЛрдВ рдХреЗ рдЗрд░рд╛рджреЗ рд╕реНрдкрд╖реНрдЯ рд╣реИрдВ - рдЧрд┐рдЯ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдПрдХ рдорд╛рд▓рд┐рдХрд╛рдирд╛ рдЖрд╡реЗрджрди рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рдореИрдВ ssh рдХреАрдЬрд╝ рдХреЛ рдЪреБрдирдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЛ рдХрд╛рдлреА рдирд╣реАрдВ рд╕рдордЭрддрд╛, рдХреНрдпреЛрдВрдХрд┐ RSA рдХреБрдВрдЬреА (рдпрд╣ рджрд╢рдХреЛрдВ рд▓рдЧреЗрдВрдЧреЗ) рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЕрднреА рднреА рдХреБрдЫ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рдП рд╣реИрдВ рддрд╛рдХрд┐ рд▓реЙрдЧ "рдЧрдбрд╝рдмрдбрд╝" рди рд╣реЛрдВред
рдХреМрди рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкрд╛рд╕рд╡рд░реНрдб рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рд╕реЗ gitolite рдФрд░ gitlab (nginx рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ) рдХреА рд░рдХреНрд╖рд╛ рдХреИрд╕реЗ рдХрд░реЗрдВ - рдмрд┐рд▓реНрд▓реА рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред
Ssh рд╕реБрд░рдХреНрд╖рд╛ред
рдХрдИ рд▓реЛрдЧ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЕрдХреЗрд▓реЗ рд▓рд┐рдирдХреНрд╕ рдкрд░ sshd рдХрдиреЗрдХреНрд╢рди рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕реАрдорд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рдереА, рд╣рдордиреЗ рдЙрдиреНрд╣реЗрдВ рдлрд╝рд╛рдпрд░рд╡реЙрд▓ рд╕реНрддрд░ рддрдХ рд╕реАрдорд┐рдд рдХрд░ рджрд┐рдпрд╛ред
CentOS рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ iptables рд╡рд┐рддрд░рдг рдореЗрдВ рдПрдХ рд╣реИрд╢рд▓реАрдо рдореЙрдбреНрдпреВрд▓ рд╣реИред рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдореИрдВрдиреЗ iptables рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рдпрдо рд▓рд┐рдЦреЗ:
iptables -N ssh_input iptables -A ssh_input \ -m hashlimit \ --hashlimit 5/m \ --hashlimit-burst 5 \ --hashlimit-mode srcip,dstport \ --hashlimit-name ssh \ --hashlimit-htable-expire 3600000 \ -j ACCEPT iptables -A ssh_input -p tcp -j REJECT --reject-with tcp-reset iptables -A INPUT -m state -m tcp -p tcp --dport 22 --state NEW -j ssh_input
рд╣рдордиреЗ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рд╣реИ? рдкрд╣рд▓реЗ рд╣рдордиреЗ ssh_input рд╢реНрд░реГрдВрдЦрд▓рд╛ рдЬреЛрдбрд╝реАред рдлрд┐рд░ рд╣рдо рдПрдХ рдирд┐рдпрдо рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬреЛ рдХрдиреЗрдХреНрд╢рди рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ 5 рдкреНрд░рддрд┐ рдорд┐рдирдЯ рддрдХ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИ (- рдЕрд╢реАрд▓рд╛рдорд┐рдЯ 5 / рдореА - рд╢рд╢рдорд┐рд▓рд┐рдд-рдлрдЯ)ред рдЗрд╕рдореЗрдВ, рд╣рдо рдЙрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рджреНрд╡рд╛рд░рд╛ рдпрд╣ рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреЛ рд╕рдореВрд╣реАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ (-рд╢рд╛рд▓рд┐рдорд┐рдд-рдореЛрдб рд▓рд┐рдкрд┐рдпреЛрдВ, dstport)ред рдмрд╛рдж рдореЗрдВ рд╣рдо рдЙрд╕ рдирд┐рдпрдо рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬреЛ рдкрд╣реБрдВрдЪ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ (-j REJECT)ред рдФрд░ рд╣рдо рдЙрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЗрдирдкреБрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬреЛ рдХрдиреЗрдХреНрд╢рди рдирдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ 22 рдкреЛрд░реНрдЯ рдореЗрдВ рдЖрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпреЗ рдирд┐рдпрдо рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ? рдкреЛрд░реНрдЯ 22 рдкрд░ рдирдП рдХрдиреЗрдХреНрд╢рди рдзреНрд╡рдЬ рд╡рд╛рд▓реЗ рд╕рднреА рдкреИрдХреЗрдЯ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП ssh_input рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рднреЗрдЬреЗ рдЬрд╛рддреЗ рд╣реИрдВред рд╡рд╣рд╛рдВ, рдЗрд╕ рд╢рд░реНрдд рдХреЗ рддрд╣рдд рдХрд┐ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдЖрдИрдкреА рд╕реЗ рдРрд╕реЗ рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рддрд┐ рдорд┐рдирдЯ 5 рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИ, рдПрдХ рдкреИрдХреЗрдЯ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (-j ACCEPT)ред рдпрджрд┐ рд╢рд░реНрддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЕрдЧрд▓реЗ рдирд┐рдпрдо рдкрд░ рдЬрд╛рдПрдВ: -j REJECTред
рдЕрдм рд╣рдорд╛рд░реЗ рд╣рдорд▓рд╛рд╡рд░ рд╕рд╛рд▓ (рджрд╕рд┐рдпреЛрдВ, рд╕реИрдХрдбрд╝реЛрдВ рд╕рд╛рд▓?) рдХреЗ рд▓рд┐рдП рдПрдХ ssh рдХреБрдВрдЬреА рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рд▓реЙрдЧ рдХрд╛ "рдЧрдбрд╝рдмрдбрд╝" рдХрдо рд╣реЛрдЧрд╛ред
рдЧрд┐рдЯрд▓рдм рд╕рдВрд░рдХреНрд╖рдг
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдорд▓рд╛рд╡рд░ gitlab рд╡реЗрдм рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд╛рд╕рд╡рд░реНрдб рд▓реЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред рдлреНрд░рдВрдЯ-рдПрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо Nginx рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╡рд╣ рдПрдХ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг 0.8.55 рдХрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдЕрдм рд╕рдордп рдФрд░ рдЗрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдмреБрдирд┐рдпрд╛рджреА рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддрд┐ рдорд┐рдирдЯ рдХрдиреЗрдХреНрд╢рди рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рддрд╛рдХрд┐ рдпрд╣ рдкрд╛рд╕рд╡рд░реНрдб рдЙрдард╛рдирд╛ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ)ред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреНрд░рддрд┐рдмрдВрдз рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗрдм рдкреЗрдЬ рд▓реЛрдб рдХрд░рдиреЗ рд╕реЗ рд╕реНрдЯреИрдЯрд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рдкрд░ рд▓рдЧрднрдЧ 15 рдФрд░ рдХреЙрд▓ рдЖрддреЗ рд╣реИрдВред рдпрд╣ рд╣рдореЗрдВ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 15 рд╕реЗ рдЕрдзрд┐рдХ рдХрдиреЗрдХреНрд╢рди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░реЗрдЧрд╛ред рдпрд╣ рд╣рдореЗрдВ рдареАрдХ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдЖрдИрдкреА рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 15 рдХрдиреЗрдХреНрд╢рди рд╣реЛрдиреЗ рдкрд░, рдПрдХ рд╣рдорд▓рд╛рд╡рд░ рдПрдХ рдкрд╛рд╕рд╡рд░реНрдб рдЙрдард╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд "рдХрд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдЭрдЧрдбрд╝рд╛" рдХрд░рддреЗ рд╣реИрдВ:
рдореВрд▓ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб
рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рдЪрдпрди рдореЗрдВ рдмрд╛рдзрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
if ($http_authorization != "Basic secretdsddsaadsdsasad=="){ return 403; break; }
рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдиреНрдп рд╕рднреА рдпреВрдЖрд░рдПрд▓ рдХреЗ рд▓рд┐рдП /ред рдкрд░ / рд╣рдо рдореВрд▓ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХрд░рддреЗ рд╣реИрдВ рдФрд░ 1 рдЖрдИрдкреА рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐ рдорд┐рдирдЯ 5 рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреА рд╕реАрдорд╛ рд╣реЛрддреА рд╣реИ:
limit_req_zone $binary_remote_addr zone=one:10m rate=5r/m; ... server { .... location = / { auth_basic "Top secret"; auth_basic_user_file /etc/nginx/conf.d/ssl/.htpasswd; limit_req zone=one burst=5 nodelay; ..... } .... }
рдЕрдм рдЖрдЗрдП рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдорд╛рд░рд╛ рдореВрд▓ рдкрд╛рд╕рд╡рд░реНрдб рдЕрднреА рднреА рдЙрдард╛рдпрд╛ рдпрд╛ рдЪреБрд░рд╛рдпрд╛ рд╣реБрдЖ рд╣реИред рд╣рдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдЧрд┐рди рдлреЙрд░реНрдо рдХреА рднреА рд░рдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ:
limit_req_zone $binary_remote_addr zone=two:10m rate=5r/m; ... server { ... location = /users/sign_in { if ($http_authorization != "Basic secretdsddsaadsdsasad=="){ // basic return 403; break; } limit_req zone=two burst=5 nodelay; .... } .... }
рдФрд░ рдЕрдВрдд рдореЗрдВ, рдЕрдиреНрдп рдкрддреЛрдВ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рд╕реНрдерд╛рди:
server { ... location / { if ($http_authorization != "Basic secretdsddsaadsdsasad=="){ // basic return 403; break; } ... } }
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЬрдм рдореВрд▓ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдХрд┐рд╕реА рднреА рдпреВрдЖрд░рдПрд▓ рдкрд░ рдореВрд▓ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рдмрд┐рдирд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ 403 рдорд┐рд▓рддреЗ рд╣реИрдВред рдореВрд▓ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗрд╡рд▓ рд░реВрдЯ рдкрд░ рд╣реА рд╕рдВрднрд╡ рд╣реИ рдФрд░ рдкреНрд░рддрд┐ рдорд┐рдирдЯ 5 рдЕрдиреБрд░реЛрдзреЛрдВ рддрдХ рд╕реАрдорд┐рдд рд╣реИред рднрд▓реЗ рд╣реА рд╡реЗ рдореВрд▓ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ, рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдлреЙрд░реНрдо рдкреНрд░рддрд┐ рдорд┐рдирдЯ 5 рдЕрдиреБрд░реЛрдзреЛрдВ рддрдХ рд╕реАрдорд┐рдд рд╣реИред рдореИрдВрдиреЗ рд╡рд┐рднрд┐рдиреНрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдмреБрдирд┐рдпрд╛рджреА рдФрд░ рд╡реЗрдм-рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рд╛ рддрд╛рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд╛рд╕рд╡рд░реНрдб рджрд░реНрдЬ рдХрд░рдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЬрдорд╛ рди рд╣реЛрдВ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ "рд╕реЗрд╡рд╛ рдЕрдиреБрдкрд▓рдмреНрдз" рди рдорд┐рд▓реЗред