Yubikey, ssh, неужели финал?

На всякий: в общем-то описанное ранее все работает и даже не вызывает раздражения, но только если ваша работа не связана с регулярными походами по многим ssh серверам. В реальности регулярное ожидание “прикоснитесь к токену” начинает раздражать уже на втором десятке коннектов. А если запустить какой-нибудь ансибл плейбук, так сидишь и настукиваешь по токену, пока плейбук пройдет по серверам. А потом, где-то на середине, опять начинаешь, ибо сессия протухла. В общем, бесит неимоверно.

После гуглежа выяснилось, что у юбиков для fido2 нет опции “не требовать прикосновения Н времени”. Для gpg есть, а для fido – нет. Боль и печаль. Поэтому самый простой способ купировать это поведение – это использовать controlpath в ssh.

Для ssh это лечится добавлением в .ssh/config следующих строк:

    ControlMaster auto
    ControlPath ~/.ssh/master-%r@%h:%p.socket
    ControlPersist 120m

Теперь, стоит вам зайти на любой хост, как любой последующий вход в течении двух часов будет происходить по уже установленной сессии. Никаких касаний и прочего не будет. Для ансибла делаем аналогично:

$ cat .ansible.cfg 
[defaults]
[ssh_connection]
ssh_args=-C -o ControlPath=~/.ssh/master-%r@%h:%p.socket -o ControlMaster=auto -o ControlPersist=120m

Теперь что ssh, что ansible будут использовать одни и те же пути, что приводит к повышению производительности. Но боль “коснись 100500 раз” просто загоняется вглубь. Что при первом запуске, что при последующих – все тоже самое. Опять гуглю. Выходит, что мимо gpg хоть так, хоть так не пройти. Ладно, у меня есть gpg!

$ gpg -K
...
sec   rsa4096 2017-09-11 [SC]
      F60000F98C6BC1B31FCAE943D9C4611813E9F51E
uid           [ultimate] Viacheslav Kaloshin <kiltum@kiltum.tech>
ssb   rsa4096 2017-09-11 [E]

Ох, аж с 2017 живет и есть пить-не просит, это хорошо. Так как у нас нынче не моден RSA, то добавляю 3 ключа ed25519:

$ gpg --quick-add-key F60000F98C6BC1B31FCAE943D9C4611813E9F51E ed25519 sign never
...
$ gpg --quick-add-key F60000F98C6BC1B31FCAE943D9C4611813E9F51E cv25519 encr never
...
$ gpg --quick-add-key F60000F98C6BC1B31FCAE943D9C4611813E9F51E ed25519 auth never
...
$ gpg -K
...
sec   rsa4096 2017-09-11 [SC]
      F60000F98C6BC1B31FCAE943D9C4611813E9F51E
uid           [ultimate] Viacheslav Kaloshin <kiltum@kiltum.tech>
ssb   rsa4096 2017-09-11 [E]
ssb   ed25519 2025-03-04 [S]
ssb   cv25519 2025-03-04 [E]
ssb   ed25519 2025-03-04 [A]

В принципе, для ssh можно добавить только последний ключ, для auth. Но я решил танцевать по-максимуму. Так, если верить докам, то сейчас у меня уже должена появиться возможность проэкспортить ssh ключ

$ gpg --export-ssh-key F60000F98C6BC1B31FCAE943D9C4611813E9F51E
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIImOGsDlDGh27/geO2YAf+lHcQAANqjjASvNhqY0Dp1H openpgp:0x0629B65F

Да, появилось. Это не может не радовать. Быстренько добавляю в стартап скрипты следующие строки, попутно вынося все, что было с ssh-agent

export GPG_TTY="$(tty)"
export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)
gpgconf --launch gpg-agent

И добавляю поддержку ssh в gpg-agent

echo enable-ssh-support >> $HOME/.gnupg/gpg-agent.conf

Открываю соседний терминал и смотрю

$ ssh-add -L
The agent has no identities.

Вот на тебе по всей морде, а не ssh ключ! Обидно, гуглю дальше. Оказывается, gpg-agent слишком секурный и просто так никому ничего не покажет. Ему надо конкретно указать, какой ключ нужен. Для этого смотрим ид ключей и добавляем в спец-файлик

$ gpg -K --with-keygrip
/Users/vvkaloshin/.gnupg/pubring.kbx
------------------------------------
sec   rsa4096 2017-09-11 [SC]
      F60000F98C6BC1B31FCAE943D9C4611813E9F51E
      Keygrip = 5F821C94AA751454412CE7887AD0026C75AC3E54
uid           [ultimate] Viacheslav Kaloshin <kiltum@kiltum.tech>
ssb   rsa4096 2017-09-11 [E]
      Keygrip = 282D042F0CA040CF13C881FBBCD190D4FF3B895E
ssb   ed25519 2025-03-04 [S]
      Keygrip = 0D336DFDE44B04C2135022A5E486A4610C0F80EA
ssb   cv25519 2025-03-04 [E]
      Keygrip = EE62D0C4FE020623BC0372ED44196435A269A045
ssb   ed25519 2025-03-04 [A]
      Keygrip = AE9CE2AC2E83722BE5F0508C7D131E91CD5FA317

$ echo AE9CE2AC2E83722BE5F0508C7D131E91CD5FA317 >> .gnupg/sshcontrol 
$ ssh-add -L
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIImOGsDlDGh27/geO2YAf+lHcQAANqjjASvNhqY0Dp1H (none)

Ура! Заработало! Можно раскидать публичный ключик по серверам и попробовать. Лично у меня заработало…

И работало некоторое время, пока опять не начало клянчить пароль, но на этот раз от gpg. Ну это лечится гораздо проще:

$ cat .gnupg/gpg-agent.conf 
...
default-cache-ttl 34560000
max-cache-ttl 34560000

Итого, оно работает. Но где тут yubikey? А с ним оказалось еще проще. Надо просто перенести ключик из внутренней базы gpg в токен.

ВНИМАНИЕ! Сделайте бекап каталога .gnupg! Он понадобится для второго токена

Для начала выбираем ключ

gpg --edit-key kiltum@kiltum.tech

gpg> key 1

sec  rsa4096/D9C4611813E9F51E
     created: 2017-09-11  expires: never       usage: SC  
     trust: ultimate      validity: ultimate
ssb* rsa4096/B2698444DC05C50F
     created: 2017-09-11  expires: never       usage: E   
ssb  ed25519/406890D12CB9E70B
     created: 2025-03-04  expires: never       usage: S   
ssb  cv25519/973D20344A973490
     created: 2025-03-04  expires: never       usage: E   
ssb  ed25519/24C65C290629B65F
     created: 2025-03-04  expires: never       usage: A   
[ultimate] (1). Viacheslav Kaloshin <kiltum@kiltum.tech>

gpg> key 4

sec  rsa4096/D9C4611813E9F51E
     created: 2017-09-11  expires: never       usage: SC  
     trust: ultimate      validity: ultimate
ssb* rsa4096/B2698444DC05C50F
     created: 2017-09-11  expires: never       usage: E   
ssb  ed25519/406890D12CB9E70B
     created: 2025-03-04  expires: never       usage: S   
ssb  cv25519/973D20344A973490
     created: 2025-03-04  expires: never       usage: E   
ssb* ed25519/24C65C290629B65F
     created: 2025-03-04  expires: never       usage: A   
[ultimate] (1). Viacheslav Kaloshin <kiltum@kiltum.tech>

gpg> key 1

sec  rsa4096/D9C4611813E9F51E
     created: 2017-09-11  expires: never       usage: SC  
     trust: ultimate      validity: ultimate
ssb  rsa4096/B2698444DC05C50F
     created: 2017-09-11  expires: never       usage: E   
ssb  ed25519/406890D12CB9E70B
     created: 2025-03-04  expires: never       usage: S   
ssb  cv25519/973D20344A973490
     created: 2025-03-04  expires: never       usage: E   
ssb* ed25519/24C65C290629B65F
     created: 2025-03-04  expires: never       usage: A   
[ultimate] (1). Viacheslav Kaloshin <kiltum@kiltum.tech>

Обратите внимание на звездочку около ssb – команда key триггерит выбор ключа, а не отменяет последний выбор! И наконец, записываю ключ в yubi

gpg> keytocard
Please select where to store the key:
   (3) Authentication key
Your selection? 3

sec  rsa4096/D9C4611813E9F51E
     created: 2017-09-11  expires: never       usage: SC  
     trust: ultimate      validity: ultimate
ssb  rsa4096/B2698444DC05C50F
     created: 2017-09-11  expires: never       usage: E   
ssb  ed25519/406890D12CB9E70B
     created: 2025-03-04  expires: never       usage: S   
ssb  cv25519/973D20344A973490
     created: 2025-03-04  expires: never       usage: E   
ssb* ed25519/24C65C290629B65F
     created: 2025-03-04  expires: never       usage: A   
[ultimate] (1). Viacheslav Kaloshin <kiltum@kiltum.tech>

Note: the local copy of the secret key will only be deleted with "save".
gpg> save

Вроде ничего не произошло страшного, кроме запроса admin кода, верно? Проверяю

[vvkaloshin@sc-mac-00565 ~]$ gpg -K
/Users/vvkaloshin/.gnupg/pubring.kbx
------------------------------------
sec   rsa4096 2017-09-11 [SC]
      F60000F98C6BC1B31FCAE943D9C4611813E9F51E
uid           [ultimate] Viacheslav Kaloshin <kiltum@kiltum.tech>
ssb   rsa4096 2017-09-11 [E]
ssb   ed25519 2025-03-04 [S]
ssb   cv25519 2025-03-04 [E]
ssb>  ed25519 2025-03-04 [A]

Теперь у ключика, который в yubi, появился символ >. Дескать, он во внешней штуке. Так и должно быть. Но у меня есть второй yubi, в него бы тоже этот ключик засунуть… Как быть? А очень просто: убиваем gpg-agent, восстанавливаем бекап .gnupg, вставляем второй ключ и повторяем операцию с записью ключа. Один-в-один, без всяких изменений.

И теперь барабанная дробь! Проверяю

$ ssh-add -L
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIImOGsDlDGh27/geO2YAf+lHcQAANqjjASvNhqY0Dp1H cardno:23_059_666

$ ssh-add -L
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIImOGsDlDGh27/geO2YAf+lHcQAANqjjASvNhqY0Dp1H cardno:23_059_689

Выше я, абсолютно ничего не делая, просто поменял токен. gpg-agent опять оказался достаточно разумным, чтобы разрулить эту ситуацию. Теперь у меня есть аж два варианта работы с этим ключем: либо с помощью юбиков, либо восстановить .gnupg из бекапа и забить на юбики. Ключ не изменится! А что самое главное, ключ защищен аж в двух местах: пароль на gpg и пин на юбике. Оба хоть и кешируются (тут удобство для меня), но при перезагрузке/смене ключа спрашиваются (тут радуется внутренний безопасник).

Что необходимо сделать следующим? Во-первых, положить бекап .gnupg в сухое место. Во-вторых, пройтись по всяким серверам и сервисам и добавить новый ssh ключ. И наконец, самое больное: пройтись по всяким серверам и сервисам и заменить публичный pgp ключ. Причина простая и прозаическая: мы добавили новых ключей и всякие git (вы же пользуете подпись в git?) стали автоматом использовать свежее и более защищенное. Пруф:

$ git log --show-signature -1
commit 37ad3b5134621b1df18644b10884b8d17f2879f9 (HEAD -> main, origin/main, origin/HEAD)
gpg: Signature made Tue Mar  4 14:12:19 2025 MSK
gpg:                using EDDSA key 12D3317E74826BD633976A76406890D12CB9E70B
gpg: Good signature from "Viacheslav Kaloshin <kiltum@kiltum.tech>" [ultimate]

Вообще зря я вас пугал болью (смаил). Это делается просто:

$ gpg --armor --export
-----BEGIN PGP PUBLIC KEY BLOCK-----

mQINBFm2d2MBEACy9YyMqPeEZEIgndjhyYOOz61WXBZtyrOaeNXlfRy2HjZZ9os2
....
=KxVu
-----END PGP PUBLIC KEY BLOCK-----

И вот этот вот текст вы суете во всем места, где просят GPG public key.

Где были проблемы? На моем пути была только одна: если у вас в gpg стоит pinentry не графический (читай: просто pinentry или pinentry-ncurses), то при попытке добавления другого, старого и проверенного ключа я получал облом.

$ ssh-add .ssh/backup/id_ed25519
Enter passphrase for .ssh/backup/id_ed25519: 
Could not add identity ".ssh/backup/id_ed25519": agent refused operation

Лечится это странной командой

$ echo UPDATESTARTUPTTY | gpg-connect-agent
OK
$ ssh-add .ssh/backup/id_ed25519
Enter passphrase for .ssh/backup/id_ed25519: 
Identity added: .ssh/backup/id_ed25519 (kiltum@kiltum.tech)

На всякий: удаляются такие ключи из базы gpg тоже не сложно:

$ gpg-connect-agent 'keyinfo --ssh-list' /bye 
S KEYINFO AE9CE2AC2E83722BE5F0508C7D131E91CD5FA317 D - - - P - - S
S KEYINFO 716AA423769B73317BBA874ECFD11765948B5EFD D - - - P - - S
OK
$ gpg-connect-agent "delete_key --force 716AA423769B73317BBA874ECFD11765948B5EFD" /bye
OK

Yubikey, часть 2. Опять ssh…

В прошлой части я писал про resident ключи. И вроде все работало. А теперь решил попробовать поработать с non-resident. И тут же столкнулся с тем, что хоть ssh-add и работал, но заходить на сервера не получалось. Если запустить ssh -v, то можно было увидеть строчки from agent: agent refused operation

Немного нагуглив, я нашел рецепт: дескать, ssh-agent нужно подтвердить, а ему не у кого. И дескать, лечится установкой ssh-askpass и правки скрипта, который пускает ssh-agent. Ок, правлю вот так:

eval $(ssh-agent -s; SSH_ASKPASS=/opt/homebrew/bin/ssh-askpass) > /dev/null

Все остальное оставляю прежним. Грохаю все и пытаюсь зайти

...
debug1: Will attempt key: /Users/xxxxxx/.ssh/id_ed25519 
debug1: Will attempt key: /Users/xxxxxx/.ssh/id_ed25519_sk 
debug1: Will attempt key: /Users/xxxxxx/.ssh/id_xmss 
debug1: Offering public key: xxxxxx@yyyyy.ru ED25519-SK SHA256:4GX39PbvB7LoXoBzPrxABAt5xC+x05y6WNtgW3qAN+A authenticator agent
debug1: Server accepts key: xxxxxx@yyyyy.ru ED25519-SK SHA256:4GX39PbvB7LoXoBzPrxABAt5xC+x05y6WNtgW3qAN+A authenticator agent
sign_and_send_pubkey: signing failed for ED25519-SK "xxxxxx@yyyyy.ru" from agent: agent refused operation
debug1: Offering public key: xxxxxx@yyyyy.ru ED25519-SK SHA256:W/dXsAitpJKpPcYNf2zB+ucsG+zx50R0hSzIQ2Lwl74 authenticator agent
debug1: Server accepts key: xxxxxx@yyyyy.ru ED25519-SK SHA256:W/dXsAitpJKpPcYNf2zB+ucsG+zx50R0hSzIQ2Lwl74 authenticator agent

debug1: Enabling compression at level 6.
Authenticated to 10.34.178.1 ([10.34.178.1]:22) using "publickey".
debug1: setting up multiplex master socket
...

В логах видно, что у меня два ключа. Первый я вынул и спрятал. А вот второй – на месте. Вот где я добавил пустую строчку – там он стал ждать прикосновения к ключу. Никаких запросов или там окошек всплывающих не появилось. Нафига нужен ssh-askpass? Не знаю. Я даже попробовал перезагрузиться и ключ вставить-вынуть – ничего не поменялось…

Yubikey, часть 1. Ну хотя бы ssh…

Долго ли, коротко, но в руках у меня снова оказался yubikey. Да, вот эта вот штука, которая устами манагеров обещает устойчивость ко взлому, фишингу и прочим ужасам современного ИТ-мира. Прошлый мой подход к юбикам окончился полной неудачей из-за кривого софта, драйверов и в общем-то моим нежеланием разбираться во всей этой мешанине букв и аббревиатур. Но тут отступать оказалось некуда, поэтому пришлось разбираться.

Итак, для начала. Если вы это делаете для себя, то берите минимум (подчеркиваю, минимум) два юбика. Дело в том, что юбики из-за природы своей не бекапятся, не обновляют прошивку и так далее и тому подобное. Если вам это вручили на работе, то вся боль по поводу работоспособности юбиков совершенно не ваша забота.

В общем, для начала надо заиметь свой юбик и поставить на комп Yubikey Manager. Ставим, запускаем, втыкаем ключ и вы должны увидеть что-то подобное этому:

Если увидели, то хорошо. Не увидели – дальше нет никакого смысла продолжать, надо разбираться, почему оно не алле.

Так как я хочу для начала настроить ssh, то (тут пропущено часов Н чтения мануалов и страничек) сходить на вкладку Applications – FIDO2 и нажать на кнопачку Change Pin. Ибо стандартный пин 123456 совершенно не секурный и вообще. После смены пина должно получиться следующее:

Ну а теперь самое интересное: необходимо сделать новый ssh ключ. Старые не подойдут, но в общем-то и не очень и хотелось. И тут внезапно появляется выбор: какой ключ делать? Если по типу шифрования вопросов нет – только ed25519, то вот резидентный или не резидентный ключ генерить…

Немного погуглив, я выяснил, что Discoverable Credential или Resident ключ – это тот, который полностью хранится в памяти ключа. А вот Non-Resident – это хранение ключей как обычно, в файликах, но без юбика они бесполезны. В чем проблема? Если у вас resident ключ и у вас сперли юбик, то злой дядька хакер сможет ходить на ваши сервера как к себе домой. Надежда на пин-код слабая, ибо подсмотреть его как нефиг делать. А если у вас non-resident ключи, то вам нужно будет таскать файлики ключей по своим рабочим машинкам. Выбирать вам. Лично я тут топлю за non-resident.

Далее все совершенно стандартно. Генерим ключ (ВНИМАНИЕ! -O resident тут сами понимаете для чего)

ssh-keygen -t ed25519-sk -O resident

… И копируем получившийся id_ed25519_sk.pub по нужным местам. Тут процедура тоже совершенно стандартная и описана 100500 раз везде.

В общем-то почти все. Набираем ssh user@host и получаем… облом по полной. Полное впечатление, что ssh тупо завис. Однако это не так, ssh просто ждет касания ключа, только почему-то не пишет об этом. Если оно горит (мне нет), то опять гуглим. Оказывается, если у вас для ssh есть обычные ключи и они уже добавлены в ssh-agent (вот тут не уверен), то для нового ключа ssh ничего решает не спрашивать. Правим .ssh/config

Host 10.10.10.10
    IdentitiesOnly yes 
    IdentityAgent none
    IdentityFile ~/.ssh/id_ed25519_sk

И пробуем снова. У меня получилось и он стал спрашивать. Так как я делал resident ключ, то теперь радостно размахивая шашкой, удаляю все честно нагенеренное, имитируя новую машину. Или после ребута. Смотрим, какие есть ключи

$ ssh-add -l
2048 SHA256:oJQZvvLl+oly0wnbSLXLQeaM76/VcZcgVNK/l1SflNQ /Users/vvkaloshin/.ssh/id_rsa (RSA)
256 SHA256:5CRS8At4Z4c3AqWK8v3vfremj7IA6sYVUrlYjWlBct0 kiltum@kiltum.tech (ED25519)

Все ок, это мои старые, “файловые”. Добавляем то, что в юбике

$ ssh-add -K
Enter PIN for authenticator: 
Resident identity added: ED25519-SK SHA256:hnN8L0j69XKrCn7emw8WkP/x0D5UXgYvLizweiL//g8
$ ssh-add -l
2048 SHA256:oJQZvvLl+oly0wnbSLXLQeaM76/VcZcgVNK/l1SflNQ /Users/vvkaloshin/.ssh/id_rsa (RSA)
256 SHA256:5CRS8At4Z4c3AqWK8v3vfremj7IA6sYVUrlYjWlBct0 kiltum@kiltum.tech (ED25519)
256 SHA256:hnN8L0j69XKrCn7emw8WkP/x0D5UXgYvLizweiL//g8  (ED25519-SK)

Вот. ED25519-SK это тот, что “спрятан” в юбике. Пробуем ходить по ssh… ходится! На этом этапе можно начинать бросать чепчики в воздух и кричать “ура!”.

Ну и на всякий, ssh-keygen -K “вытащит” из юбика публичный ключ прямо в текущий каталог. Правда, получившийся приватный ключ получится фейковым non-resident и все равно, без юбика ничего работать не будет.

Удаленный доступ в WSL

В прошлом посте я получил доступ до консоли windows через ssh. Это жалкое, душераздирающее зрелище. Но внутри виндовса живет ubuntu. Можно конечно начать заморачиваться с пробросом портов, но проще сделать так:

New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\WINDOWS\System32\bash.exe" -PropertyType String -Force

И все, теперь отличить получившееся от нормальной машины можно только по косвенным признакам.

Windows 10 ssh key auth

Потребовалось тут сходить на windows 10 по ssh. Казалось бы, идешь в настройки, приложения, добавляешь “фичу” в виде OpenSSH server и вуаля! А в реальности оказалось фиг там.

Во-первых, почему-то по умолчанию ssh сервер не запущен и не запускается автоматически. Но это лечится запуском консоли powershell и скармливанием туда следующих команд

Start-Service sshd
Set-Service -Name sshd -StartupType 'Automatic'

После этого надо узнать свой логин для ssh. Это чуть проще – просто открываем окно терминала и смотрим.

C:\Users\multi>

Почему-то логин у меня multi, хотя везде я multik. Куда делась последняя буква – я не знаю.

Следующим шагом я довольно долго пытался сделать авторизацию по ключу. Фигу. Сервер упорно сопротивлялся. Оказалось, что микрософт зачем-то только для администраторов вынес ключи не туда, где им положено быть, а в C:\ProgramData\ssh\administrators_authorized_keys . Повторюсь, только для админов.

Вылечить это можно поправив sshd_config в каталоге выше и закомментировав две последние строки. Ну либо забить и в этот файлик любым способом сложить ключи. После этого надо вернуть эту файлу права (куда они делись – хз). Для этого надо скормить в консоль повершелла следующее

$acl = Get-Acl C:\ProgramData\ssh\administrators_authorized_keys     
$acl.SetAccessRuleProtection($true, $false)     
$administratorsRule = New-Object system.security.accesscontrol.filesystemaccessrule("Administrators","FullControl","Allow")     
$systemRule = New-Object system.security.accesscontrol.filesystemaccessrule("SYSTEM","FullControl","Allow")     
$acl.SetAccessRule($administratorsRule)     
$acl.SetAccessRule($systemRule)     
$acl | Set-Acl

Все. После этого у меня заработал вход на винду по ключам.

Ускоряем повторные соединения в ssh

Каждый раз, когда я по ssh соединяюсь с удаленным хостом, он проверяет ключи и прочие параметры. И не важно, что я только что был на этом хосте с соседнего терминала этой машины. Каждая такая проверка занимает немного времени, но занимает.

Добавляем следующие строки в .ssh/config

Host *
    ControlMaster auto
    ControlPath ~/.ssh/master-%r@%h:%p.socket
    ControlPersist 30m

Путь может быть любым, но рекомендую выбирать только доступный вам. %r , %h, %p – это пользователь, хост и порт соответственно.

Новый сервер с игрищами и блудницами – 5

Или баррикадируемся от подборщиков паролей.

Захожу я утром на свой сервер, а мне добрая система сообщает

Last failed login: Sat Jan 23 10:23:49 MSK 2016 from 183.3.202.106 on ssh:notty
There were 5278 failed login attempts since the last successful login.

Китайцы и прочий народ ломится, пытается пароль к руту пободрать. Не то, что бы это напрягало, но тем не менее, некрасиво.

-A INPUT -p tcp -m state --state NEW --dport 22 -m recent --update --seconds 20 -j DROP
-A INPUT -p tcp -m state --state NEW --dport 22 -m recent --set -j ACCEPT
#-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

Как это работает, можно почитать на хабре в комментах.

Поглядел в логи – ляпота и чистота.

Теперь (лично мне) надо поставить 6ю центось. Надо по двум причинам: попробовать графическую консоль (ибо в полном тексте как 7я оно не ставится), и надо для OpenVZ, у которой опять же с 7й еще есть проблемы.

Поначалу я попробовал SPICE, предлагаемый по умолчанию. Тормозит дико. Даже на толстых каналах. Плюс клиентов нет под всякие разные операционки. Попробовал vnc – вот это другое дело. Не скажу, что прямо как “на настоящем”, но работать вполне можно.

virt-install --name openvz --ram 8912 --disk path=/vm/openvz.qcow2,size=8,bus=virtio,cache=none --vcpus 4 --os-type linux --network bridge=virbr0,model=virtio -c /vm/iso/CentOS-6.7-x86_64-minimal.iso --accelerate --noautoconsole --graphics vnc,password=test,listen=10.100.0.254 -v --input tablet,bus=usb

Теперь ssh -L 5900:10.100.0.254:5900 root@host и любым VNC клиентом на 127.0.0.1:5900. Пароль, как видно из команды – test. Просто, удобно и понятно.

Но мне понравилось, что можно в машину забраться и через virsh console. В винтуальной машине делаем

cat /etc/init/ttyS0.conf
stop on runlevel[016]
start on runlevel[345]
respawn
instance /dev/ttyS0
exec /sbin/mingetty /dev/ttyS0

В самый конец /etc/securetty добавляем
ttyS0

И запускаем

initctl start ttyS0

И в общем, должны попасть через virsh console. Для логов загрузки, для kernel в /etc/grub.conf добавляем

console=ttyS0

У меня все получилось. Дальше иду как написано в вики OpenVZ. Ставлю, мигрирую и так далее.