Kubernetes рдореЗрдВ RBAC рдХреА рдЬрд╛рдБрдЪ рдХрд░рдирд╛

рдХреБрдмреЗрд░рдиреЗрдЯ рдХреНрд▓рд╕реНрдЯрд░ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рдПрдХ рдмрд╛рдд рд╣реИ, рд▓реЗрдХрд┐рди рд╕реБрд░рдХреНрд╖рд╛ рдмрдирд╛рдП рд░рдЦрдирд╛ рдЕрднреА рднреА рдПрдХ рдЪреБрдиреМрддреА рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдореЗрдВ рдирдП рдЙрдкрдХрд░рдг рдЬреЛрдбрд╝реЗ рдЧрдП рд╣реИрдВ: рдЕрдм рджреЛрдиреЛрдВ рдХреЛ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред


рдЫрд╡рд┐


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


рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ, рд╣рдо рдпрд╣ рдирд╣реАрдВ рд╕рдордЭ рдкрд╛рдПрдВрдЧреЗ рдХрд┐ рдЖрд░рдмреАрдПрд╕реА рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕рднреНрдп рд╕реНрд░реЛрдд рд╣реИрдВ:



рдЕрдкрдиреЗ рд╡реНрдпрд╡рд╕рд╛рдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрд░рдмреАрдПрд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдЬреЛ рдЪрд▓ рд░рд╣реЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╡реЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВред


рд╣рдорд╛рд░реА рд▓рд┐рдкрд┐


рдХреБрдЫ рд╕рдВрдЧрдарди рдирдП Kubernetes рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рд╕рдореВрд╣реЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рдЖрдк рдПрдХ рдкрдбрд╝реЛрд╕реА рд╕рдореВрд╣ рдХреА рддреИрдирд╛рддреА рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рдХреЛрдИ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдЕрдВрддрд░рд╕рдореВрд╣ рд╕рдорд╕реНрдпрд╛рдПрдВ рдпрд╛ рдбрд╛рдЙрдирдЯрд╛рдЗрдореНрд╕ рди рд╣реЛрдВред


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


рдПрдХ рд╣рдлреНрддрд╛ рдмреАрдд рдЧрдпрд╛ред рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рдорд╛рд▓рд┐рдХ рдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдПрдХ рдкреГрдердХ рдирд╛рдо рд╕реНрдерд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдирд╛рдорд╕реНрдерд╛рди рд╕реЗ рд░рд╣рд╕реНрдп рдкрдврд╝ рд░рд╣рд╛ рд╣реИред рдРрд╕рд╛ рдХреИрд╕реЗ? рдЙрдиреНрд╣реЛрдВрдиреЗ RBAC рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛!


рдореИрдВрдиреЗ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди, рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ, рд╕рд┐рд╕реНрдЯрдо рдХреЛ рд╡рд╛рдВрдЫрд┐рдд рдкрд░рд┐рдгрд╛рдо рдХреЗ рдЕрдиреБрдкрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ kubectl CLI Kubernetes kubectl RBAC рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред kubectl auth can-i


рдХреНрдпрд╛ рдореИрдВ? ("рдХреНрдпрд╛ рдореИрдВ?")
can-i рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рд╡рд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ: kubectl auth can-i VERB [TYPE | TYPE/NAME | NONRESOURCEURL] kubectl auth can-i VERB [TYPE | TYPE/NAME | NONRESOURCEURL] kubectl auth can-i VERB [TYPE | TYPE/NAME | NONRESOURCEURL] ред рдЕрдм рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЙрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдЙрдкрд▓рдмреНрдз рд╣реИред рдЖрдЗрдП рдЬрд╛рдиреЗ:


 kubectl auth can-i create pods 

рдпрд╣ рдЙрдЪрд┐рдд рдирд┐рдХрд╛рд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде "рд╣рд╛рдВ" рдпрд╛ "рдирд╣реАрдВ" рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред


рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрдм рдХрд┐рд╕реА рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рд╣рдо рдПрдХ рд╕рдорд╕реНрдпрд╛ рднрд░ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ: рд╡рд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЬрд┐рд╕рдХреЗ рдЕрдВрддрд░реНрдЧрдд рд╣рдо рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рдЕрдзрд┐рдХреГрдд рд╣реИрдВ ./kube/config рдХреЙрдиреНрдлрд╝рд┐рдЧ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рд╣реЛрдирд╛ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдлрд┐рд░ рд╕реЗ рдмрдЪрд╛рд╡ рдореЗрдВ рдЖрддрд╛ рд╣реИ: рдпрд╣ --as --as= рдФрд░ --as-group= рдЯреИрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИред


рдХрдорд╛рдВрдб рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ, рдХрд┐рд╕реА рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕рд┐рдореБрд▓реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:


 kubectl auth can-i create pods --as=me 

рд╣рдореЗрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рдХреЛрдб 1 , рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ "рдирд╣реАрдВ" рд╡рд╛рдкрд╕ рдЖ рдЧрдИ рд╣реИред


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


рд╕реНрд╡рдЪрд╛рд▓рди


рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕реЗ рд░реЛрдХрдирд╛ рдмрд╣реБрдд рдЬрд▓реНрджреА рд╣реИ: рдЕрдм рд╣рдо рдПрдХ рдкрд░реАрдХреНрд╖рдг рдЕрдиреБрдХреНрд░рдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВ рдЬреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрд╕реЗ рд╕реАрдбреА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓рд╛рдПрдЧрд╛ред рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП!


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


рдиреАрдЪреЗ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдпрд╣ рдЖрд░рдмреАрдПрд╕реА рдирд┐рдпрдореЛрдВ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рд╕рдореВрд╣ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдирд╛рдорд╕реНрдерд╛рди рдореЗрдВ рдЪрд▓ рд░рд╣реЗ рдЪреВрд▓реНрд╣реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ "рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп" рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реЗрдЯ рдХреА рдЧрдИ рд╣реИред рдпрд╛ - bats filename рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ред


 #!/usr/bin/env bats @test "Team namespaces can scale deployments within their own namespace" { run kubectl auth can-i update deployments.apps --subresource="scale" --as-group="$group" --as="$user" -n $ns [ "$status" -eq 0 ] [ "$output" == "yes" ] done } 

--as рдФрд░ --as-group рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд RBAC рдирд┐рдпрдореЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ:


 rules: - apiGroups: - authorization.k8s.io resources: - selfsubjectaccessreviews - selfsubjectrulesreviews verbs: - create 

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


рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

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


All Articles