web-dev-qa-db-ja.com

暗号化パスワードの回復/変更

先週、ドライブ全体の暗号化パスワードを愚かに変更しました。明らかに以前のパスワードを確実に入力することができなかったからです。残念ながら、それ以来私のコンピューターはオンになっていて、新しいパスワードをどこにも書き留めていないので、それを忘れてしまいました。私の最も誇らしい瞬間ではありませんが、パスワードを入力する時が来る前に気づいたのは非常にありがたいです。私はまだコンピューターにログインしているため、すべてのファイルにアクセスできますが、コンピューターをシャットダウンするとすぐに運が悪くなります。できればすべてを再インストールする必要はありません。

だから私の質問は、まだ管理者としてログインしている間に暗号化パスワードを回復/変更する方法はありますか?

1
Julie K

復号化されたパーティションのバックアップと復元:これは少し技術的な警告です

このほとんどを自動化するスクリプトをいくつかまとめていますが、しばらく待てない場合は、以下の手順をテストしました。自分が何をしているかを知っていることを確認してください。私が書いたコマンドを盲目的にたどらないでください。それらの中には、システム構成に固有の置換が必要な場合があります。スクリプトを完成したら。それらをGitHubにアップロードして、この回答を編集します。

残念ながら、暗号化パスワードを回復または変更することはできません。既存のキーまたはパスフレーズのいずれかがなければ、新しいキーを作成することはできません。ただし、システムにログインしているので、幸運です!技術的には完全な再インストールを必要としないオプションがあります。ドライブ全体の暗号化を使用していると言うので、ドライブに2つのメインパーティション、ブートパーティションとLUKSパーティションがあると仮定します(EFIを使用している場合、おそらく3番目のパーティションがありますそれ)。次に、復号化されたLUKSパーティションは、おそらく他のすべての復号化されたパーティションにLVMを使用しています。
おそらく、lsblkの出力は次のようになります。

 NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT 
 sr0 11:0 1 1024M 0 rom 
 sda 8:0 0 16G 0 disk 
├─sda28:2 0 488M 0 part/boot
├─sda38:3 0 15G 0 part 
│└─sda3_crypt253:0 0 15G 0 crypt 
│ ├─ubuntu--vg-root253:1 0 11.8G 0 lvm/
│└─ubuntu--vg-swap_1253:2 0 3.3G 0 lvm [SWAP] 
└─sda1 8:1 0 512M 0 part /boot/efi

ここで関心のある唯一の部分は、sdaディスクです。


それを実現する方法、一般的に

基本的に、暗号化されるシステムのビットはsda3であり、LUKSで暗号化されます。ロック解除されたLUKSパーティションには、sda3_cryptという名前の単一のボリュームグループをホストするLVM物理ボリュームubuntu--vgが含まれます。このボリュームグループには、2つのLVM論理ボリュームubuntu--vg-rootubuntu--vg-swap_1が含まれます。 LVM物理ボリュームsda3_cryptをバックアップできれば、sda3の古いLUKSパーティションを吹き飛ばし、新しいパーティションを作成して、LVM物理ボリュームを新しいLUKSパーティションにダンプできます。ただし、キャッチが1つあります。ブートパーティション内のすべてのブートファイルsda2は、破壊した古いLUKSパーティションを引き続き参照します。作成した新しいLUKSパーティションを指すように/etc/crypttabファイルを更新し、initramディスクを再構築する必要があります。それが終了した後にのみ、システムを再起動してください。

これを実現するための実際の手順については、次のセクションを読み続けてください。


実際の段階的なプロセス

  1. ワイプする余裕のあるドライブ、または少なくともsda3と同じかそれ以上のサイズのパーティションを持つドライブが必要になります。このプロセスでは、ドライブまたはパーティションの内容は完全に消去されます。ドライブ全体を使用してこの例を実行します。
  2. ドライブを接続した状態でlsusbを実行し、外部ディスク、私の場合はsdbを見つけます。
     sdb 8:16 0 16G 0ディスク
    └─sdb18:17 0 16G 0 part /media/test/external-drive
    sr0 11:0 1 1024M 0 rom 
     sda 8:0 0 16G 0 disk 
    ├─sda28:2 0 488M 0 part/boot
    ├─sda38:3 0 15G 0 part 
    │ └─sda3_crypt253:0 0 15G 0 crypt 
    │├─ubuntu--vg-root253:1 0 11.8G 0 lvm/
    │└─ubuntu--vg-swap_1253:2 0 3.3G 0 lvm [SWAP] 
    └─sda18:1 0 512M 0 part /boot/efi
    
  3. そこにあるコンテンツを上書きするため、外付けドライブのマウントを解除します。次のコマンドで、/media/test/external-driveをドライブへの実際のパスに置き換えます。
    Sudo umount /media/test/external-drive
  4. 既存の復号化されたLVM物理ボリュームを外部デバイスにクローンする必要があります。次のコマンドで、sdXを外付けハードドライブのデバイスに置き換えます。私の場合、... of=/dev/sdb...と書きます。また、sda3_cryptをLUKSパーティションの名前に置き換えます。これには長い時間がかかります。 16GB LUKSパーティションのみのテストでは35分かかりました。
    Sudo dd if=/dev/mapper/sda3_crypt of=/dev/sdX bs=4M status=progress
  5. これ以降、復元時にシステムに加えた変更が存在しない可能性があることに注意してください。実際、バックアップ中はコンピューターを使用しない方がおそらく良いでしょう。
  6. バックアップが完了したら、ライブのUbuntu USBを使用してコンピューターを再起動し、インストールせずにUbuntuを試すオプションを選択します。
  7. システムが起動したら、ターミナルを開いてルートにドロップします。
    Sudo -i
  8. この端末で、古いパーティションの上に新しいLUKSパーティションを作成します。私の例では、LUKSパーティションはsda3にあります。以下のコマンドのsdaNの代わりに、システムの正しい番号に置き換えてください。
    cryptsetup luksFormat -c aes-xts-plain64 -s 512 -h sha512 /dev/sdaN
  9. プロンプトに従い、決して忘れたくないパスフレーズを入力します。
  10. それが完了したら、LUKSパーティションのロックを解除する必要があります。次のコマンドでシステムに合わせて番号を変更し、数字の3をデバイスに適した番号に置き換えます。
    cryptsetup luksOpen /dev/sda3 sda3_crypt
  11. これで、復号化されたLUKSパーティションが開かれ、LVM物理ボリュームをダンプする準備が整いました(次のコマンド)。 XsdXを外付けドライブのデバイスに置き換えます。 3sda3_cryptを適切なパーティション番号に置き換えます。 dd if=/dev/sdX of=/dev/mapper/sda3_crypt
  12. 繰り返しますが、すべてが復元されるまで、非常に長い時間待たなければなりません。待っている間に他にやるべきことを見つけてください。
  13. 復元が完了したら、外付けドライブを取り外して再起動します。システムを再起動して内部ドライブのブートファイルの更新を完了するときに、LVMの競合がないことを確認する必要があります。外部ドライブなしで再起動したら、ターミナルを開き、手順7のようにルートにドロップします。
  14. 次に、LUKSパーティションを再度復号化する必要があります。ルートターミナルで次のコマンドを実行し、数字の3をパーティションの正しい番号に置き換えます。プロンプトが表示されたら、作成したパスワードを入力します。これは二度と忘れることはありません。
    cryptsetup /dev/sda3 sda3_crypt
  15. 次に、次の手順でコマンドを簡素化するためにいくつかの変数を設定します。次のそれぞれを実行します。出力は変数に保存されるため表示されません
    • vg=$(pvscan | grep PV | tr -s ' ' | cut -f 5 -d ' ') <-ボリュームグループ名を$ vgに保存
    • export uuid=$(blkid | grep LUKS | grep -oP "\bUUID=\".*?\"" | tr -d '"' | cut -f 2 -d '=') <-LUKS UUIDを$ uuidに保存します(すべて1行です)
  16. あと1つだけ行うことがあります。それはブートファイルを更新することです。それを行うには、いくつかのものをマウントする必要があります。ルート端末で次のコマンドを実行して、すべてをマウントします。この例のパーティション情報を使用します。コマンドを適宜変更してください。
    • mount /dev/mapper/${vg/-/--}-root /mnt
    • mount /dev/sda2 /mnt/boot
    • mount /dev/sda1 /mnt/boot/efi <-UEFIシステムに対してのみこれを行います
    • mount --bind /dev /mnt/dev
    • mount --bind /run/lvm /mnt/run/lvm
  17. 次に、実際のシステムにchrootする必要があります。
    chroot /mnt
    このchrootされた端末内で次のコマンドが実行されていることを確認してください!
  18. ブートファイルを更新する前に、さらに2つをマウントする必要があります。
    • mount -t proc proc /proc
    • mount -t sysfs sys /sys
    • mount -t devpts devpts /dev/pts
  19. 次に、/etc/crypttabファイルを新しいLUKSパーティションのUUIDで更新する必要があります。
    sed -i "s/UUID=\([0-9a-f\-]\+\)/UUID=$uuid/" /etc/crypttab
  20. 最後に、ブートファイルを更新します。
    update-initramfs -k all -c
    update-grub
1
b_laoshi