рд╕реБрд░рдХреНрд╖рд╛ рдХреНрд░рд┐рдм: рдбреЙрдХрдЯрд░



рдбреЙрдХрд░ рдХрдВрдЯреЗрдирд░ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдХрдВрдЯреЗрдирд░реАрдХрд░рдг рддрдХрдиреАрдХ рд╣реИрдВред рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рджреЗрд╡ рдФрд░ рдкрд░реАрдХреНрд╖рдг рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рд╕рдордп рдХреЗ рд╕рд╛рде рдпрд╣ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдмрджрд▓ рдЧрдпрд╛ред рдмрд╛рд░рд┐рд╢ рдХреЗ рдмрд╛рдж рдорд╢рд░реВрдо рдХреА рддрд░рд╣ рдбреЙрдХрдЯрд░ рдХрдВрдЯреЗрдирд░ рдЙрддреНрдкрд╛рджрди рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЧреБрдгрд╛ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдореЗрдВ рд╕реЗ рдХреБрдЫ рдиреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛ рдХрд┐ рдбреЙрдХ рдХрдВрдЯреЗрдирд░ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХреИрд╕реЗ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдУрдбрдмреНрд▓реНрдпреВрдПрдПрд╕рдкреА рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдордиреЗ рдирд┐рдпрдореЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рддреИрдпрд╛рд░ рдХреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдбреЙрдХрдЯрд░ рдХрдВрдЯреЗрдирд░реЛрдВ рдкрд░ рдирд┐рд░реНрдорд┐рдд рдЖрдкрдХреЗ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреА рд╕реБрд░рдХреНрд╖рд╛ рд╣реЛрдЧреАред

рдирд┐рдпрдо реж

рд╣реЛрд╕реНрдЯ рдорд╢реАрди рдФрд░ рдбреЙрдХрд░ рдореЗрдВ рд╕рднреА рд╡рд░реНрддрдорд╛рди рдЕрдкрдбреЗрдЯ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред


рдХрдВрдЯреЗрдирд░ рдкрд░реНрдпрд╛рд╡рд░рдг рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдиреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдХрдордЬреЛрд░рд┐рдпреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрдЬрдмрд╛рди рдкреНрд░рдгрд╛рд▓реА, рдЬреЛ рдЖрдорддреМрд░ рдкрд░ рдореЗрдЬрдмрд╛рди рд╕рд┐рд╕реНрдЯрдо рдкрд░ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рд╡реГрджреНрдзрд┐ рдХрд╛ рдХрд╛рд░рдг рдмрдирддреА рд╣реИ, рдореЗрдЬрдмрд╛рди рдУрдПрд╕, рдбреЙрдХрд░ рдЗрдВрдЬрди рдФрд░ рдбреЙрдХрд░ рдорд╢реАрди рдХреЗ рд▓рд┐рдП рд╕рднреА рдкреИрдЪ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдмреЗрд╣рдж рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрдВрдЯреЗрдирд░ (рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрдиреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд) рд╣реЛрд╕реНрдЯ рдХреЗ рд╕рд╛рде рдХрд░реНрдиреЗрд▓ рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдХрдВрдЯреЗрдирд░ рдХреЗ рдЕрдВрджрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓рд╛ рдХрд░реНрдиреЗрд▓ рд╕реАрдзреЗ рд╣реЛрд╕реНрдЯ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдХрд░реНрдиреЗрд▓ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рд╡реГрджреНрдзрд┐ (рдЬреИрд╕реЗ рдХрд┐ рдЧрдВрджреЗ рдЧрд╛рдп) рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреГрдердХ рдХрдВрдЯреЗрдирд░ рдХреЗ рдЕрдВрджрд░ рдЪрд▓рдиреЗ рд╕реЗ рдореЗрдЬрдмрд╛рди рдкрд░ рд░реВрдЯ рдПрдХреНрд╕реЗрд╕ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рдирд┐рдпрдо рез

рдбреЛрдХрд░ рдбреЗрдореЙрди рдХреЗ рд╕реЙрдХреЗрдЯ рддрдХ рдкрд╣реБрдВрдЪ рди рджреЗрдВ


Docker рд╕реЗрд╡рд╛ (рдбреЗрдореЙрди) рдЖрдиреЗ рд╡рд╛рд▓реЗ API рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП UNIX рд╕реЙрдХреЗрдЯ /var/run/docker.sock рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИред рдЗрд╕ рд╕рдВрд╕рд╛рдзрди рдХрд╛ рд╕реНрд╡рд╛рдореА рдореВрд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ рдХреЛрдИ рдЙрдкрд╛рдп рдирд╣реАрдВред рдЗрд╕ рд╕реЙрдХреЗрдЯ рдореЗрдВ рдПрдХреНрд╕реЗрд╕ рдЕрдзрд┐рдХрд╛рд░ рдмрджрд▓рдирд╛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд╣реЛрд╕реНрдЯ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рд░реВрдЯ рдПрдХреНрд╕реЗрд╕ рджреЗрдиреЗ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреЛ рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рд╕рд╛рде /var/run/docker.sock рд╕реЙрдХреЗрдЯ рдХреЛ рдмрдВрдж рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд╣рд╛рдВ рдЖрдк рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд╕реЗрд╡рд╛ рд╕реЗ рд╕рдордЭреМрддрд╛ рдХрд░рдиреЗ рд╕реЗ рдореЗрдЬрдмрд╛рди рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдкреВрд░рд╛ рдирд┐рдпрдВрддреНрд░рдг рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрдВрдЯреЗрдирд░ рд╣реИрдВ рдЬреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:

-v /var/run/docker.sock://var/run/docker.sock 

рдпрд╛ рдбреЙрдХрдЯрд░-рдХрдореНрдкреЛрдЬрд╝ рдХреЗ рд▓рд┐рдП:

 volumes: - "/var/run/docker.sock:/var/run/docker.sock" 

рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдХреА рддрддреНрдХрд╛рд▓ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдФрд░ рдЖрдЦрд┐рд░реА - рдХрднреА рдирд╣реАрдВ, рд╕реБрдирдирд╛, рдХрднреА рднреА рдкреВрд░реНрдг рдирд┐рд╢реНрдЪрд┐рддрддрд╛ рдХреЗ рдмрд┐рдирд╛ рдбреЙрдХрд░ рдЯреАрд╕реАрдкреА рд╕реЙрдХреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ рдЬреЛ рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реБрд░рдХреНрд╖рд╛ рд╡рд┐рдзрд┐рдпреЛрдВ (рдХрдо рд╕реЗ рдХрдо рдкреНрд░рд╛рдзрд┐рдХрд░рдг) рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд┐рдирд╛ред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдбреЙрдХрд░ рдЯреАрд╕реАрдкреА рд╕реЙрдХреЗрдЯ рдмрд╛рд╣рд░реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ 0.0.0.0:2375 (2376, HTTPs рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ) рдкрд░ рдПрдХ рдкреЛрд░реНрдЯ рдЦреЛрд▓рддрд╛ рд╣реИ рдФрд░ рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рдкреВрд░реНрдг рдирд┐рдпрдВрддреНрд░рдг рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рдВрднрд╛рд╡рд┐рдд рд╣реЛрд╕реНрдЯ рд╕рд┐рд╕реНрдЯрдоред

рдирд┐рдпрдо реи

рдХрдВрдЯреЗрдирд░ рдХреЗ рдЕрдВрджрд░ рдПрдХ рдЕрдкреНрд░рдХрд╛рд╢рд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ


рдПрдХ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдВрдЯреЗрдирд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рд╡реГрджреНрдзрд┐ рд╣рдорд▓реЗ рд╕реЗ рдмрдЪрдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИред рдпрд╣ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

1. "рдбреЙрдХ рд░рди" рдХрдорд╛рдВрдб рдХреЗ "-u" рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛:

 docker run -u 4000 alpine 

2. рдЫрд╡рд┐ рдирд┐рд░реНрдорд╛рдг рдХреЗ рджреМрд░рд╛рди:

 FROM alpine RUN groupadd -r myuser && useradd -r -g myuser myuser <      root-, ,  > USER myuser 

3. рдбреЙрдХрд░ рдбреЗрдореЙрди рдореЗрдВ "рдпреВрдЬрд░ рдиреЗрдорд╕реНрдкреЗрд╕" (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд░реНрдпрд╛рд╡рд░рдг) рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╕рдХреНрд╖рдо рдХрд░реЗрдВ:

 --userns-remap=default 

рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝реЗрдВред

Kubernetes рдореЗрдВ, рдмрд╛рдж рдореЗрдВ runAsNonRoot рд╡рд┐рдХрд▓реНрдк рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реБрд░рдХреНрд╖рд╛ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 kind: ... apiVersion: ... metadata: name: ... spec: ... containers: - name: ... image: .... securityContext: ... runAsNonRoot: true ... 

рдирд┐рдпрдо рей

рдХрдВрдЯреЗрдирд░ рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рд╕реАрдорд┐рдд рдХрд░реЗрдВ


рд▓рд┐рдирдХреНрд╕ рдкрд░, рдХрд░реНрдиреЗрд▓ 2.2 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░, рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдХреНрд╖рдорддрд╛рдУрдВ (рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП, рд▓рд┐рдВрдХ рджреЗрдЦреЗрдВ) рдирд╛рдордХ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред

рдбреЛрдХрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЗрди рдХрд░реНрдиреЗрд▓ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдФрд░ рдпрд╣ рдЖрдкрдХреЛ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рд╕реЗрдЯ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:

 --cap-drop тАФ     --cap-add тАФ     

рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рд╕реБрд░рдХреНрд╖рд╛ рд╕реЗрдЯрд┐рдВрдЧ рдкрд╣рд▓реЗ рд╕рднреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░рдирд╛ рд╣реИ (- рд╕рднреА рдбреНрд░реЙрдк), рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рд▓реЛрдЧреЛрдВ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:

 docker run --cap-drop all --cap-add CHOWN alpine 

рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг (!): -рдкреНрд░рд╛рдкреНрдд рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рдХрдВрдЯреЗрдирд░ рдЪрд▓рд╛рдиреЗ рд╕реЗ рдмрдЪреЗрдВ !!!

Kubernetes рдореЗрдВ, Linux рдХрд░реНрдиреЗрд▓ рдХреНрд╖рдорддрд╛рдУрдВ рдХреА рдмрд╛рдзрд╛ рдХреЛ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 kind: ... apiVersion: ... metadata: name: ... spec: ... containers: - name: ... image: .... securityContext: ... capabilities: drop: - all add: - CHOWN ... 

рдирд┐рдпрдо рек

рдиреЛ-рдиреНрдпреВ-рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдзреНрд╡рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


рдХрдВрдЯреЗрдирд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ - рд╕реБрд░рдХреНрд╖рд╛-рдСрдкреНрдЯ = рдиреЛ-рдиреНрдпреВ-рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдзреНрд╡рдЬ рдЬреЛ рдХрдВрдЯреЗрдирд░ рдХреЗ рдЕрдВрджрд░ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рд╡реГрджреНрдзрд┐ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИред

Kubernetes рдореЗрдВ, рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдХреНрд╖рдорддрд╛рдУрдВ рдХреА рдмрд╛рдзрд╛ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ AllowPrivilegeEscalation рд╡рд┐рдХрд▓реНрдк рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХреА рдЧрдИ рд╣реИ:

 kind: ... apiVersion: ... metadata: name: ... spec: ... containers: - name: ... image: .... securityContext: ... allowPrivilegeEscalation: false ... 

рдирд┐рдпрдо рел

рдЗрдВрдЯрд░-рдХрдВрдЯреЗрдирд░ рд╕рдВрдЪрд╛рд░ рдмрдВрдж рдХрд░реЗрдВ


рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдбреЙрдХрд░ рдореЗрдВ рдЕрдВрддрд░-рдХрдВрдЯреЗрдирд░ рд╕рдВрдЪрд╛рд░ рд╕рдХреНрд╖рдо рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╕рднреА рдХрдВрдЯреЗрдирд░ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (docker0 рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ)ред рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ -cc = рдЭреВрдареЗ рдЭрдВрдбреЗ рдХреЗ рд╕рд╛рде рдбреЙрдХрд░ рд╕реЗрд╡рд╛ рдЪрд▓рд╛рдХрд░ рдЕрдХреНрд╖рдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдирд┐рдпрдо рем

рд▓рд┐рдирдХреНрд╕ рд╕реБрд░рдХреНрд╖рд╛ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ (Linux рд╕реБрд░рдХреНрд╖рд╛ рдореЙрдбреНрдпреВрд▓ - seccomp, AppArmor, SELinux)


рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдбреЙрдХрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рд┐рдирдХреНрд╕ рд╕реБрд░рдХреНрд╖рд╛ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдлрд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдХреЛ рдХрднреА рднреА рдЕрдХреНрд╖рдо рди рдХрд░реЗрдВ! рдЕрдзрд┐рдХрддрдо рдЬреЛ рдЙрдирдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рд╡рд╣ рдирд┐рдпрдореЛрдВ рдХреЛ рдХрд╕рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред

Seccomp рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдпрд╣рд╛рдБ рдЙрдкрд▓рдмреНрдз рд╣реИ ред

Docker рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП AppArmor рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░ Docker Engine рд╕реНрд╡рдпрдВ рдХрдВрдЯреЗрдирд░ рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ AppArmor рдХреЗ рд▓рд┐рдП рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдмрдирд╛рддрд╛ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп:

 $ docker run --rm -it hello-world 

рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ:

 $ docker run --rm -it --security-opt apparmor=docker-default hello-world 

рдкреНрд░рд▓реЗрдЦрди рднреА nginx рдХреЗ рд▓рд┐рдП рдПрдХ AppArmor рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рд╕рдВрднрд╡ рд╣реИ (рдЖрд╡рд╢реНрдпрдХ!)

 #include <tunables/global> profile docker-nginx flags=(attach_disconnected,mediate_deleted) { #include <abstractions/base> network inet tcp, network inet udp, network inet icmp, deny network raw, deny network packet, file, umount, deny /bin/** wl, deny /boot/** wl, deny /dev/** wl, deny /etc/** wl, deny /home/** wl, deny /lib/** wl, deny /lib64/** wl, deny /media/** wl, deny /mnt/** wl, deny /opt/** wl, deny /proc/** wl, deny /root/** wl, deny /sbin/** wl, deny /srv/** wl, deny /tmp/** wl, deny /sys/** wl, deny /usr/** wl, audit /** w, /var/run/nginx.pid w, /usr/sbin/nginx ix, deny /bin/dash mrwklx, deny /bin/sh mrwklx, deny /usr/bin/top mrwklx, capability chown, capability dac_override, capability setuid, capability setgid, capability net_bind_service, deny @{PROC}/* w, # deny write for all files directly in /proc (not in a subdir) # deny write to files not in /proc/<number>/** or /proc/sys/** deny @{PROC}/{[^1-9],[^1-9][^0-9],[^1-9s][^0-9y][^0-9s],[^1-9][^0-9][^0-9][^0-9]*}/** w, deny @{PROC}/sys/[^k]** w, # deny /proc/sys except /proc/sys/k* (effectively /proc/sys/kernel) deny @{PROC}/sys/kernel/{?,??,[^s][^h][^m]**} w, # deny everything except shm* in /proc/sys/kernel/ deny @{PROC}/sysrq-trigger rwklx, deny @{PROC}/mem rwklx, deny @{PROC}/kmem rwklx, deny @{PROC}/kcore rwklx, deny mount, deny /sys/[^f]*/** wklx, deny /sys/f[^s]*/** wklx, deny /sys/fs/[^c]*/** wklx, deny /sys/fs/c[^g]*/** wklx, deny /sys/fs/cg[^r]*/** wklx, deny /sys/firmware/** rwklx, deny /sys/kernel/security/** rwklx, } 

рдирд┐рдпрдо 7

рдХрдВрдЯреЗрдирд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд╕реАрдорд┐рдд рдХрд░реЗрдВ


рдпрд╣ рдирд┐рдпрдо рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ: рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЛ рдЕрдЧрд▓реЗ DoS / DDoS рд╣рдорд▓реЗ рдХреЗ рджреМрд░рд╛рди рд╕рднреА рд╕рд░реНрд╡рд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдирд╖реНрдЯ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХрдВрдЯреЗрдирд░ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЙрдкрдпреЛрдЧ рд╕реАрдорд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рд╕реАрдорд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдореЗрдореЛрд░реА рдХреА рдорд╛рддреНрд░рд╛, рд╕реАрдкреАрдпреВ, рдХрдВрдЯреЗрдирд░ рдкреБрдирд░рд╛рд░рдВрдн рдХреА рд╕рдВрдЦреНрдпрд╛ред

рддреЛ рдЪрд▓рд┐рдП рдХреНрд░рдо рдореЗрдВред

рд╕реНрдореГрддрд┐

-M рдпрд╛ --memory рд╡рд┐рдХрд▓реНрдк

рдПрдХ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдЕрдзрд┐рдХрддрдо рдорд╛рддреНрд░рд╛ рдореЗрдВ рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдиреНрдпреВрдирддрдо рдореВрд▓реНрдп 4 рдореАрдЯрд░ (4 рдореЗрдЧрд╛рдмрд╛рдЗрдЯ) рд╣реИред

рд╡рд┐рдХрд▓реНрдк - рд╕реНрддрди-рд╕реНрд╡реИрдк

рд╕реНрд╡реИрдк (рд╕реНрд╡реИрдк рдлрд╝рд╛рдЗрд▓) рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдкред рдЪрд╛рд▓рд╛рдХреА рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛:

  • рдпрджрд┐ --ememory-swap> 0 рд╣реИ, рддреЛ тАУememory рдзреНрд╡рдЬ рдХреЛ рднреА рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореЗрдореЛрд░реА-рд╕реНрд╡реИрдк рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕реНрд╡реИрдк рдХреЗ рд╕рд╛рде рдХрдВрдЯреЗрдирд░ рдХреЛ рдХреБрд▓ рдореЗрдореЛрд░реА рдХрд┐рддрдиреА рдЙрдкрд▓рдмреНрдз рд╣реИред
  • рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдгред рдпрджрд┐ --memory = "300m", рдФрд░ --emory-swap = "1g" рд╣реИ, рддреЛ рдХрдВрдЯреЗрдирд░ 300MB рдореЗрдореЛрд░реА рдФрд░ 700MB рд╕реНрд╡реИрдк (1g - 300m) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
  • рдпрджрд┐ - рдорд┐рдореЛрд░реА-рд╕реНрд╡реИрдк = 0, рд╕реЗрдЯрд┐рдВрдЧ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • рдпрджрд┐ - рдореАрдореЛрд░реА-рд╕реНрд╡реИрдк рдХреЛ рд╕рдорд╛рди рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд╕реНрд╡реИрдк рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
  • рдпрджрд┐ --memory-swap рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди - memory рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИ, рддреЛ рд╕реНрд╡реИрдк рдХреА рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдореЗрдореЛрд░реА рдХреА рдорд╛рддреНрд░рд╛ рдХреЗ рджреЛрдЧреБрдиреЗ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧреАред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ --memory = "300m", рдФрд░ --ememory-swap рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ рдХрдВрдЯреЗрдирд░ 300MB рдореЗрдореЛрд░реА рдФрд░ 600MB рд╕реНрд╡реИрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред
  • рдпрджрд┐ - рдорд┐рдореЛрд░реА-рд╕реНрд╡реИрдк = -1, рддреЛ рдХрдВрдЯреЗрдирд░ рд╕рднреА рд╕реНрд╡реИрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ рдЬреЛ рдореЗрдЬрдмрд╛рди рд╕рд┐рд╕реНрдЯрдо рдкрд░ рд╕рдВрднрд╡ рд╣реИред

рдкрд░рд┐рдЪрд╛рд░рд┐рдХрд╛ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ: рдХрдВрдЯреЗрдирд░ рдХреЗ рдЕрдВрджрд░ рд╢реБрд░реВ рдХреА рдЧрдИ рдореБрдлреНрдд рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрдВрдЯреЗрдирд░ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╕реНрд╡реИрдк рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореВрд▓реНрдп рдирд╣реАрдВ рджрд┐рдЦрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрдЬрдмрд╛рди рд╕реНрд╡реИрдк рдХреА рд╕рдВрдЦреНрдпрд╛ред

рд╡рд┐рдХрд▓реНрдк --oom-рдорд╛рд░-рдЕрдХреНрд╖рдо рдХрд░реЗрдВ

рдЖрдкрдХреЛ OOM (рдЖрдЙрдЯ рдСрдлрд╝ рдореЗрдореЛрд░реА) рд╣рддреНрдпрд╛рд░реЗ рдХреЛ рд╕рдХреНрд╖рдо рдпрд╛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдЪреЗрддрд╛рд╡рдиреА! рдЖрдк OOM рдХрд┐рд▓рд░ рдХреЛ рдХреЗрд╡рд▓ --memory рд╡рд┐рдХрд▓реНрдк рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдмрдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдиреНрдпрдерд╛ рдРрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХрдВрдЯреЗрдирд░ рдХреЗ рдЕрдВрджрд░-рдмрд╛рд╣рд░ рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рде, рдХрд░реНрдиреЗрд▓ рд╣реЛрд╕реНрдЯ рд╕рд┐рд╕реНрдЯрдо рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдорд╛рд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдЧрд╛ред

рдЕрдиреНрдп рд╕реНрдореГрддрд┐ рдкреНрд░рдмрдВрдзрди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рдХрд▓реНрдк, рдЬреИрд╕реЗ --memory-swappiness, --memory- рдЖрд░рдХреНрд╖рдг, рдФрд░ - рдХрд░реНрдиреЗрд▓-рдореЗрдореЛрд░реА, рдХрдВрдЯреЗрдирд░ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдЯреНрдпреВрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╣реИрдВред

рдкреНрд░реЛрд╕реЗрд╕рд░

рд╡рд┐рдХрд▓реНрдк - рдХрд╛рд░реНрдкрд╕

рд╡рд┐рдХрд▓реНрдк рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрдВрдЯреЗрдирд░ рдХрд┐рддрдиреЗ рдЙрдкрд▓рдмреНрдз рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рд╕реАрдкреАрдпреВ рдХреЗ рд╕рд╛рде рдПрдХ рдореЗрдЬрдмрд╛рди рд╣реИ рдФрд░ рд╣рдо --cpus = "1.5" рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХрдВрдЯреЗрдирд░ рдХреЛ рдбреЗрдврд╝ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИред

рд╡рд┐рдХрд▓реНрдк - рд╕реАрдкреАрдпреВ-рд╕реАрдкрд╕

рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЛрд░ рдпрд╛ рд╕реАрдкреАрдпреВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИред рдорд╛рди рдПрдХ рд╣рд╛рдЗрдлрд╝рди рдпрд╛ рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рдХреЗ рд╕рд╛рде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрдиреБрдордд рдХреЛрд░ рдХреА рд╕реАрдорд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рджреВрд╕рд░реЗ рдореЗрдВ - рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЛрд░ред

рдХрдВрдЯреЗрдирд░ рдкреБрдирд░рд╛рд░рдВрдн рдХреА рд╕рдВрдЦреНрдпрд╛

 --restart=on-failure:<number_of_restarts> 

рдпрджрд┐ рдпрд╣ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд░реВрдк рд╕реЗ рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕реЗрдЯрд┐рдВрдЧ рд╕реЗрдЯ рдХрд░рддреА рд╣реИ рдХрд┐ рдХрд┐рддрдиреА рдмрд╛рд░ рдбреЛрдХрд░ рдХрдВрдЯреЗрдирд░ рдХреЛ рдкреБрдирдГ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рдХрдВрдЯреЗрдирд░ рдХреА рд╕реНрдерд┐рддрд┐ рдЪрд▓ рд░рд╣реА рд╣реИ, рддреЛ рдХрд╛рдЙрдВрдЯрд░ рд░реАрд╕реЗрдЯ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдПрдХ рдЫреЛрдЯреА рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 5, рдЬреЛ рдПрдХ рдЧреИрд░-рдХрд╛рд░реНрдпрд╢реАрд▓ рд╕реЗрд╡рд╛ рдХреЗ рдЕрдВрддрд╣реАрди рдкреБрдирд░рд╛рд░рдВрдн рд╕реЗ рдмрдЪрдирд╛ рд╣реЛрдЧрд╛ред

рдирд┐рдпрдо 8

рд░реАрдб-рдУрдирд▓реА рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдФрд░ рд╡реЙрд▓реНрдпреВрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


рдпрджрд┐ рдХрдВрдЯреЗрдирд░ рдХреЛ рдХрд╣реАрдВ рднреА рдХреБрдЫ рднреА рдирд╣реАрдВ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рддреЛ рдЖрдкрдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рд░реАрдб-рдУрдирд▓реА рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдШреБрд╕рдкреИрдард┐рдпреЗ рдХреЗ рдЬреАрд╡рди рдХреЛ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рдХрд░реЗрдЧрд╛ред

рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдПрдХ рдХрдВрдЯреЗрдирд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:

 docker run --read-only alpine 

рд░реАрдб-рдУрдирд▓реА рдореЛрдб рдореЗрдВ рд╡реЙрд▓реНрдпреВрдо рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:

 docker run -v volume-name:/path/in/container:ro alpine 

рдирд┐рдпрдо реп

рдХрдВрдЯреЗрдирд░ рд╕реБрд░рдХреНрд╖рд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЙрдкрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


рдЬреНрдЮрд╛рдд рдХрдордЬреЛрд░рд┐рдпреЛрдВ рд╡рд╛рд▓реЗ рдХрдВрдЯреЗрдирд░реЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрдирдореЗрдВ рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЕрднреА рддрдХ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рд╣реИрдВ:

тАв рдирд┐: рд╢реБрд▓реНрдХ


тАв рд╡рд╛рдгрд┐рдЬреНрдпрд┐рдХ:


рдФрд░ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдг рд╣реИрдВ:

Source: https://habr.com/ru/post/hi448704/


All Articles