Bots start brute-forcing a server with password login within the first few minutes. Go through the checklist in order, the commands are for Ubuntu/Debian as root.
Don’t close the root session until you check in a separate window that you can log in as the new user and run sudo. Otherwise you risk losing administrative access.
Optional. Moving SSH off port 22 cuts out the bulk of blind brute-forcing: it’s not protection, but there is less noise in the logs. Before experimenting with access, make a backup.
Firewall – if ufw is enabled, open the new port first, otherwise you lock yourself out: ufw allow 2222/tcp.
SSH – in /etc/ssh/sshd_config set, for example, Port 2222 and restart: systemctl restart ssh. On Ubuntu 24.04 and newer SSH listens through ssh.socket, run systemctl daemon-reload and systemctl restart ssh.socket there instead.
fail2ban – add the new port, otherwise it quietly stops protecting SSH. In /etc/fail2ban/jail.local, in the [sshd] section, add or replace the port line:
{"docsConfig":{"theme":"aspen","$schema":"https://mintlify.com/docs.json","name":"Lumi","description":"Серверы VPS Lumi: настройка, подключение и решение проблем","colors":{"primary":"#0EA5E9","light":"#38BDF8","dark":"#0284C7"},"logo":{"light":"https://mintcdn.com/lumi-8e9f3d35/2MclTGnmS1VG2Abe/logo.svg?fit=max\u0026auto=format\u0026n=2MclTGnmS1VG2Abe\u0026q=85\u0026s=f86070567b66af34654de1a77f8360ff","dark":"https://mintcdn.com/lumi-8e9f3d35/2MclTGnmS1VG2Abe/logo.svg?fit=max\u0026auto=format\u0026n=2MclTGnmS1VG2Abe\u0026q=85\u0026s=f86070567b66af34654de1a77f8360ff"},"favicon":"https://mintcdn.com/lumi-8e9f3d35/eTLjd4bhyqCNp3WB/favicon.svg?fit=max\u0026auto=format\u0026n=eTLjd4bhyqCNp3WB\u0026q=85\u0026s=07499b3f01b1b78ec5d44f31210e6dd8","appearance":{"default":"dark"},"background":{"color":{"light":"#F6F5F4","dark":"#1E1E1F"}},"navbar":{"links":[],"primary":{"type":"button","label":"Канал Lumi","href":"https://t.me/+7XIA2JUDcbAyNjA0"}},"footer":{"socials":{}},"search":{"prompt":"Поиск"},"fonts":{"family":"Inter"},"styling":{"codeblocks":"system","latex":false},"contextual":{"options":[],"display":"header"},"navigation":{"languages":[{"language":"ru","default":true,"href":"vps"},{"language":"en","href":"en/vps"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"lumi-8e9f3d35","hasAudioNarration":false,"actualSubdomain":"lumi-8e9f3d35","customDomains":["wiki.lumiweb.cc"],"gitSource":{"type":"github","owner":"nvrloseeee-hash","repo":"lumidocs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ac6411e78c1c22ae0f1c88e","collectionId":"bb88e502-e415-4c87-91bb-dba60129529b","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ac6411e78c1c22ae0f1c88e"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6ac6411e78c1c22ae0f1c88e","clientVersion":"0.0.4006","searchFilterCounts":[{"language":"en","tag":"VPS","count":26},{"language":"ru","tag":"VPS","count":26},{"language":"en","tag":"Software \u0026 services","count":12},{"language":"ru","tag":"Софт и сервисы","count":12},{"language":"en","tag":"Setup","count":8},{"language":"ru","tag":"Настройка","count":8},{"language":"en","tag":"Basics","count":4},{"language":"ru","tag":"Основное","count":4},{"language":"en","tag":"Protection \u0026 issues","count":2},{"language":"ru","tag":"Защита и проблемы","count":2}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":"#sidebar-content{width:16rem!important}#sidebar-content a{white-space:nowrap}"}],"page":{"pagePath":"en/vps/hardening","slug":"/en/vps/hardening","pageMetadata":{"title":"Server hardening","sidebarTitle":"Hardening","description":"Security checklist: keys, ufw, fail2ban, updates","icon":"lock","href":"/en/vps/hardening"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Security checklist: keys, ufw, fail2ban, updates\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`Bots start brute-forcing a server with password login within the first few minutes. Go through the checklist in order, the commands are for Ubuntu/Debian as `,_jsx(_components.code,{children:`root`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`keys-and-firewall`,children:`Keys and firewall`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Key-based SSH login`}),` – set up a key and disable password login, then brute-forcing becomes pointless: `,_jsx(_components.a,{href:`/en/vps/ssh-keys`,children:`SSH keys`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Firewall`}),` – close all incoming ports except the ones you need: `,_jsx(_components.a,{href:`/en/vps/firewall`,children:`Firewall`}),`.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`updates`,children:`Updates`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Fresh packages`}),` – they fix known vulnerabilities:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`apt`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` update`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` \u0026\u0026 `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`apt`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` upgrade`})]}),`\n`]})})}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Auto-updates`}),` – security updates install themselves:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`apt`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` install`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` unattended-upgrades`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`dpkg-reconfigure`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -plow`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` unattended-upgrades`})]}),`\n`]})})}),`\n`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`fail2ban`,children:`fail2ban`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`fail2ban`}),` watches the logs and temporarily bans an IP that brute-forces the SSH password.`]}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Install`}),`:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`apt`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` install`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` fail2ban`})]}),`\n`]})})}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Settings`}),` – in `,_jsx(_components.code,{children:`jail.local`}),`, updates don’t overwrite it:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`nano`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` /etc/fail2ban/jail.local`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Add:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`5`,language:`ini`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`ini`,children:_jsxs(_components.code,{language:`ini`,numberOfLines:`5`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#D4D4D4`},children:`[sshd]`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`enabled`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` = true`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`maxretry`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` = 5`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`findtime`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` = 600`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`bantime`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` = 3600`})]}),`\n`]})})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:_jsx(_components.code,{children:`maxretry`})}),` – how many failed attempts are allowed.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:_jsx(_components.code,{children:`findtime`})}),` – the window in seconds over which attempts are counted: 600 = 10 minutes.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:_jsx(_components.code,{children:`bantime`})}),` – how many seconds to ban for: 3600 = 1 hour.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Debian 12`}),` – fail2ban does not start without `,_jsx(_components.code,{children:`/var/log/auth.log`}),`: add the line `,_jsx(_components.code,{children:`backend = systemd`}),` to the section.`]}),`\n`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Start and check`}),` – the second command shows how many addresses are banned right now:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`systemctl`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` enable`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --now`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` fail2ban`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`fail2ban-client`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` status`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` sshd`})]}),`\n`]})})}),`\n`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`user-with-sudo`,children:`User with sudo`}),`\n`,_jsxs(_components.p,{children:[`Under root, any mistake or breach gives full control of the server at once. Create a regular user with the right to use `,_jsx(_components.code,{children:`sudo`}),`:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`adduser`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` NAME`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`usermod`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -aG`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` sudo`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` NAME`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`From now on log in as that user, and run commands that need privileges through `,_jsx(_components.code,{children:`sudo`}),`. Password login already off – copy the root key to the new user:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`5`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`5`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`mkdir`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -p`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` /home/NAME/.ssh`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`cp`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` /root/.ssh/authorized_keys`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` /home/NAME/.ssh/`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`chown`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -R`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` NAME:NAME`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` /home/NAME/.ssh`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`chmod`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 700`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` /home/NAME/.ssh`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`chmod`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 600`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` /home/NAME/.ssh/authorized_keys`})]}),`\n`]})})}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Don’t close the root session until you check in a separate window that you can log in as the new user and run `,_jsx(_components.code,{children:`sudo`}),`. Otherwise you risk losing administrative access.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`ssh-port`,children:`SSH port`}),`\n`,_jsxs(_components.p,{children:[`Optional. Moving SSH off port 22 cuts out the bulk of blind brute-forcing: it’s not protection, but there is less noise in the logs. Before experimenting with access, make a `,_jsx(_components.a,{href:`/en/vps/backups`,children:`backup`}),`.`]}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Firewall`}),` – if `,_jsx(_components.code,{children:`ufw`}),` is enabled, open the new port first, otherwise you lock yourself out: `,_jsx(_components.code,{children:`ufw allow 2222/tcp`}),`.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`SSH`}),` – in `,_jsx(_components.code,{children:`/etc/ssh/sshd_config`}),` set, for example, `,_jsx(_components.code,{children:`Port 2222`}),` and restart: `,_jsx(_components.code,{children:`systemctl restart ssh`}),`. On Ubuntu 24.04 and newer SSH listens through `,_jsx(_components.code,{children:`ssh.socket`}),`, run `,_jsx(_components.code,{children:`systemctl daemon-reload`}),` and `,_jsx(_components.code,{children:`systemctl restart ssh.socket`}),` there instead.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`fail2ban`}),` – add the new port, otherwise it quietly stops protecting SSH. In `,_jsx(_components.code,{children:`/etc/fail2ban/jail.local`}),`, in the `,_jsx(_components.code,{children:`[sshd]`}),` section, add or replace the `,_jsx(_components.code,{children:`port`}),` line:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`3`,language:`ini`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`ini`,children:_jsxs(_components.code,{language:`ini`,numberOfLines:`3`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#D4D4D4`},children:`[sshd]`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`enabled`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` = true`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`port`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` = 2222`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Restart fail2ban:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`systemctl`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` restart`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` fail2ban`})]}),`\n`]})})}),`\n`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Next: `,_jsx(_components.a,{href:`/en/vps/backups`,children:`Backups`}),`, `,_jsx(_components.a,{href:`/en/vps/firewall`,children:`Firewall`}),`.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"codeStyling":"system","config":{},"pageMetadata":{"title":"Server hardening","sidebarTitle":"Hardening","description":"Security checklist: keys, ufw, fail2ban, updates","icon":"lock","href":"/en/vps/hardening"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Keys and firewall","slug":"keys-and-firewall","depth":2,"children":[]},{"title":"Updates","slug":"updates","depth":2,"children":[]},{"title":"fail2ban","slug":"fail2ban","depth":2,"children":[]},{"title":"User with sudo","slug":"user-with-sudo","depth":2,"children":[]},{"title":"SSH port","slug":"ssh-port","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"lumi-8e9f3d35","siteName":"Lumi","title":"Server hardening - Lumi","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"ru":{"href":"/vps/hardening","matchLevel":1},"en":{"href":"/en/vps/hardening","matchLevel":0}}},"lastModified":"2026-10-04T13:36:58.258Z","originalFileLocation":"en/vps/hardening.mdx","locale":"en"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"dark\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Security checklist: keys, ufw, fail2ban, updates\">\u003cmeta data-mint-head name=\"application-name\" content=\"Lumi\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/lumi-8e9f3d35/xL3B4vgHb9JI4RjC/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/lumi-8e9f3d35/xL3B4vgHb9JI4RjC/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/lumi-8e9f3d35/xL3B4vgHb9JI4RjC/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/lumi-8e9f3d35/xL3B4vgHb9JI4RjC/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/lumi-8e9f3d35/xL3B4vgHb9JI4RjC/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/lumi-8e9f3d35/xL3B4vgHb9JI4RjC/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/lumi-8e9f3d35/xL3B4vgHb9JI4RjC/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/lumi-8e9f3d35/xL3B4vgHb9JI4RjC/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/lumi-8e9f3d35/xL3B4vgHb9JI4RjC/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Server hardening - Lumi\">\u003cmeta data-mint-head property=\"og:description\" content=\"Security checklist: keys, ufw, fail2ban, updates\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Lumi\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://wiki.lumiweb.cc/en/vps/hardening\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://lumi-8e9f3d35.mintlify.app/_mintlify/api/og/v2?division=Protection+%26+issues\u0026amp;title=Server+hardening\u0026amp;description=Security+checklist%3A+keys%2C+ufw%2C+fail2ban%2C+updates\u0026amp;theme=7c698ff8427173e2bbc2bba2\u0026amp;signature=0461e2f4350cc9ee9f7071e166f70f15663c658899849c0475fb4fabd01c53d0\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Server hardening - Lumi\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Security checklist: keys, ufw, fail2ban, updates\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://lumi-8e9f3d35.mintlify.app/_mintlify/api/og/v2?division=Protection+%26+issues\u0026amp;title=Server+hardening\u0026amp;description=Security+checklist%3A+keys%2C+ufw%2C+fail2ban%2C+updates\u0026amp;theme=7c698ff8427173e2bbc2bba2\u0026amp;signature=0461e2f4350cc9ee9f7071e166f70f15663c658899849c0475fb4fabd01c53d0\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/lumi-8e9f3d35/xL3B4vgHb9JI4RjC/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Lumi\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0EA5E9\">\u003clink data-mint-head rel=\"canonical\" href=\"https://wiki.lumiweb.cc/en/vps/hardening\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/en/vps/hardening.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://wiki.lumiweb.cc/en/vps/hardening\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ru\" href=\"https://wiki.lumiweb.cc/vps/hardening\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://wiki.lumiweb.cc/vps/hardening\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://wiki.lumiweb.cc/#organization\",\"name\":\"Lumi\",\"url\":\"https://wiki.lumiweb.cc\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/lumi-8e9f3d35/2MclTGnmS1VG2Abe/logo.svg?fit=max\u0026auto=format\u0026n=2MclTGnmS1VG2Abe\u0026q=85\u0026s=f86070567b66af34654de1a77f8360ff\"}},{\"@type\":\"WebSite\",\"@id\":\"https://wiki.lumiweb.cc#website\",\"name\":\"Lumi\",\"url\":\"https://wiki.lumiweb.cc\",\"publisher\":{\"@id\":\"https://wiki.lumiweb.cc/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://wiki.lumiweb.cc/en/vps/hardening#webpage\",\"url\":\"https://wiki.lumiweb.cc/en/vps/hardening\",\"name\":\"Server hardening\",\"description\":\"Security checklist: keys, ufw, fail2ban, updates\",\"dateModified\":\"2026-10-04T13:36:58.258Z\",\"isPartOf\":{\"@id\":\"https://wiki.lumiweb.cc#website\"},\"breadcrumb\":{\"@id\":\"https://wiki.lumiweb.cc/en/vps/hardening#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://wiki.lumiweb.cc/en/vps/hardening#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Lumi\",\"item\":\"https://wiki.lumiweb.cc\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Server hardening\",\"item\":\"https://wiki.lumiweb.cc/en/vps/hardening\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://wiki.lumiweb.cc/en/vps/hardening#article\",\"headline\":\"Server hardening\",\"name\":\"Server hardening\",\"description\":\"Security checklist: keys, ufw, fail2ban, updates\",\"url\":\"https://wiki.lumiweb.cc/en/vps/hardening\",\"mainEntityOfPage\":{\"@id\":\"https://wiki.lumiweb.cc/en/vps/hardening#webpage\"},\"dateModified\":\"2026-10-04T13:36:58.258Z\",\"publisher\":{\"@id\":\"https://wiki.lumiweb.cc/#organization\"},\"isPartOf\":{\"@id\":\"https://wiki.lumiweb.cc#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Lumi\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Lumi","nav":{"global":null,"languages":[{"language":"ru","default":true,"pages":[{"title":"ru","href":"/vps/hardening"}]},{"language":"en","tabs":[{"tab":"VPS","icon":"server","groups":[{"group":"Basics","icon":"server","pages":[{"title":"VPS plans","sidebarTitle":"Plans","icon":"gauge-high","href":"/en/vps"},{"title":"Server management","sidebarTitle":"Management","icon":"sliders","href":"/en/vps/manage"},{"title":"Locations and OS","sidebarTitle":"Locations and OS","icon":"earth-europe","href":"/en/vps/os"},{"title":"Connection","sidebarTitle":"Connection","icon":"terminal","href":"/en/vps/connect"}]},{"group":"Setup","icon":"screwdriver-wrench","pages":[{"title":"SSH keys","sidebarTitle":"SSH keys","icon":"key","href":"/en/vps/ssh-keys"},{"title":"Firewall (ufw)","sidebarTitle":"Firewall","icon":"shield-halved","href":"/en/vps/firewall"},{"title":"Backups","sidebarTitle":"Backups","icon":"box-archive","href":"/en/vps/backups"},{"title":"Swap file","sidebarTitle":"Swap","icon":"memory","href":"/en/vps/swap"},{"title":"Network configuration","sidebarTitle":"Network","icon":"network-wired","href":"/en/vps/network"},{"title":"Reverse DNS (PTR)","sidebarTitle":"Reverse DNS","icon":"arrows-rotate","href":"/en/vps/reverse-dns"},{"title":"Web server (Nginx)","sidebarTitle":"Web server","icon":"server","href":"/en/vps/webserver"},{"title":"SSL and Let's Encrypt","sidebarTitle":"SSL","description":"HTTPS on your own server","icon":"lock","href":"/en/vps/ssl"}]},{"group":"Protection \u0026 issues","icon":"shield-halved","pages":[{"title":"Server hardening","sidebarTitle":"Hardening","icon":"lock","href":"/en/vps/hardening"},{"title":"VPS not working","sidebarTitle":"Not working","description":"Connection, password, load, disk, IP on blocklists","icon":"triangle-exclamation","href":"/en/vps/troubleshooting"}]},{"group":"Software \u0026 services","icon":"cubes","pages":[{"title":"WireGuard VPN","sidebarTitle":"WireGuard","icon":"shield-halved","href":"/en/vps/wireguard"},{"title":"OpenVPN","sidebarTitle":"OpenVPN","icon":"lock","href":"/en/vps/openvpn"},{"title":"Amnezia (no terminal)","sidebarTitle":"Amnezia","icon":"user-shield","href":"/en/vps/amnezia"},{"title":"3X-UI (Xray/VLESS)","sidebarTitle":"3X-UI","icon":"gauge-high","href":"/en/vps/3x-ui"},{"title":"Marzban","sidebarTitle":"Marzban","icon":"layer-group","href":"/en/vps/marzban"},{"title":"Your own proxy (3proxy)","sidebarTitle":"Your own proxy","icon":"network-wired","href":"/en/vps/proxy-3proxy"},{"title":"Docker","sidebarTitle":"Docker","icon":"box","href":"/en/vps/docker"},{"title":"n8n (automation)","sidebarTitle":"n8n","icon":"diagram-project","href":"/en/vps/n8n"},{"title":"Keitaro (tracker)","sidebarTitle":"Keitaro","icon":"chart-line","href":"/en/vps/keitaro"},{"title":"Your own LLM (Ollama)","sidebarTitle":"Your own LLM","icon":"robot","href":"/en/vps/llm"},{"title":"MikroTik CHR","sidebarTitle":"MikroTik","icon":"route","href":"/en/vps/mikrotik"},{"title":"Coolify (your own PaaS)","sidebarTitle":"Coolify","icon":"rocket","href":"/en/vps/panel"}]}]}]}]},"title":"Server hardening - Lumi","buildId":"dpl_2xiSHD9XEvLsPGPcfoMtkLTB3dy9","deploymentId":"dpl_2xiSHD9XEvLsPGPcfoMtkLTB3dy9","dynamics":[],"chunks":[]}