Πρόσθετα δημόσια κλειδιά SSH που προστίθενται στο αρχείο εξουσιοδοτημένων κλειδιών στο Linux VM

Ισχύει για
Virtual Machine running Linux

Σύνοψη

Εκτός από το ότι επιτρέπει στους χρήστες να παρέχουν τα δικά τους ζεύγη κλειδιών SSH για έλεγχο ταυτότητας, η πλατφόρμα Microsoft Azure βασίζεται σε ζεύγη πλήκτρων SSH για την ενεργοποίηση ορισμένων δυνατοτήτων που προστίθενται στην εικονική μηχανή (VM) κατά τη στιγμή της ανάπτυξης. Πρόσφατα ανακαλύψαμε ότι, σε ορισμένα περιορισμένα σενάρια, τα δημόσια κλειδιά από αυτά τα πιστοποιητικά πλατφόρμας Azure θα μπορούσαν να προστεθούν απροσδόκητα στο αρχείο .ssh/authorized_keys. Αυτά τα σενάρια περιορίζονται μόνο σε μια κατάσταση στην οποία η εικονική μηχανή παρέχεται με χρήση του cloud-init και ο χρήστης επιλέγει πρόσθετες Azure δυνατότητες που βασίζονται σε πιστοποιητικά, όπως μια ταυτότητα υπηρεσίας διαχειριζόμενη από το σύστημα.

Αυτή η μη αναμενόμενη συμπεριφορά παρουσιάζεται εξαιτίας μιας αλλαγής στη λογική παροχής συγκεκριμένων λειτουργικών συστημάτων. Πρόκειται για συστήματα που χρησιμοποιούν cloud-init και εγκαθιστούν κατά λάθος το δημόσιο κλειδί από όλα τα πιστοποιητικά που είναι διαθέσιμα στην εικονική μηχανή σε ένα αρχείο κλειδιών εξουσιοδοτημένων με ssh κατά τη δημιουργία της εικονικής μηχανής.  

Για να μάθετε περισσότερα, μεταβείτε στο CVE-2019-0816.

Περισσότερες πληροφορίες

Λεπτομέρειες σεναρίου

Η λογική cloud-init που αναφέρεται στην ενότητα "Σύνοψη" είναι επί του παρόντος γνωστό ότι υπάρχει στις εικόνες Azure για το Ubuntu 18.04 εκτός από τις εικόνες cloud-init Public Preview RHEL 7.4/7.5/7.6 και CentOS 7.4. Μπορεί επίσης να υπάρχει σε προσαρμοσμένες εικόνες που χρησιμοποιούν αυτά τα λειτουργικά συστήματα. 
 
Εάν ενεργοποιήσετε μία από τις παρακάτω δυνατότητες κατά την παροχή μιας από τις Linux εικόνες, ενδέχεται να δείτε πρόσθετα, μη αναμενόμενα κλειδιά σε ένα αρχείο .ssh/authorized_keys, όπως οποιοδήποτε από τα εξής:

  • Διαχειριζόμενη ταυτότητα
  • Επεκτάσεις με προστατευμένες ρυθμίσεις
  • Ανάπτυξη εικονικής μηχανής με πλήκτρα Key Vault σε εικονική μηχανή

Προσδιορισμός και αποκατάσταση υπαρχόντων εικονικών μηχανών

Αναγνώριση

Για να ελέγξετε εάν έχετε πρόσθετα κλειδιά, εξετάστε το αρχείο εξουσιοδοτημένων κλειδιών (αρχείο vi .ssh/authorized_keys) για να προσδιορίσετε εάν έχουν προστεθεί πρόσθετα κλειδιά που δεν σκοπεύατε να συμπεριλάβετε.

Είναι ασφαλές να αφαιρέσετε με μη αυτόματο τρόπο τυχόν πρόσθετα δημόσια κλειδιά ssh που μπορεί να έχουν προστεθεί. Αυτό δεν θα επηρεάσει τις δυνατότητες που αναπτύσσονται μαζί με την εικονική μηχανή. Επίσης, δεν θα επηρεάσει το καθορισμένο ζεύγος κλειδιών SSH για έλεγχο ταυτότητας.

Εάν δεν γνωρίζετε ή δεν μπορείτε να διακρίνετε ποια δημόσια κλειδιά στο αρχείο .ssh/authorized_keys καθορίσατε για έλεγχο ταυτότητας, ακολουθήστε τα εξής βήματα:

  1. Ελέγξτε τα πρότυπα ανάπτυξής σας:

    1. Δημόσια κλειδιά SSH
    2. Κλειδιά SSH σε διαμόρφωση cloud-init
  2. Ανακτήστε τα αναπτυγμένα κλειδιά ssh κατά τη στιγμή της δημιουργίας από το εσωτερικό του VM, εάν έχετε πρόσβαση sudo/root. Για να το κάνετε αυτό, ακολουθήστε τα παρακάτω βήματα:

    1. Ελέγξτε τη διαμόρφωση cloud-init που διαβιβάστηκε στο CustomData: sudo cat /var/lib/waagent/ovf-env.xml | grep "<ns1:CustomData>"
      Χρησιμοποιήστε την τιμή CustomData και, στη συνέχεια, χρησιμοποιήστε την αποκωδικοποίηση base64 για να λάβετε τα δημόσια κλειδιά που αναπτύξατε:

echo "<customData value>" | base64 -D 2. Εναλλακτικά, ελέγξτε την υπηρεσία Instance Meta Data Service (IMDS) για να δείτε το δημόσιο κλειδί ssh που μεταβιβάστηκε στην ιδιότητα δημόσιου κλειδιού ssh της εικονικής μηχανής Δημιουργία: curl -H Metadata:true "http://169.254.169.254/metadata/instance/compute/publicKeys?api-version=2018-04-02&format=json"

Αποκατάσταση συστήματος

Εάν έχετε προσδιορίσει πρόσθετα πιστοποιητικά που δεν σκοπεύατε να αναπτύξετε στην εικονική μηχανή, μπορείτε να τα καταργήσετε διαγράφοντας την αντίστοιχη γραμμή από το αρχείο authorized_keys.

Εκτελέστε την αποκατάσταση λειτουργιών, με αλληλεπιδραστική σύνδεση στην εικονική μηχανή ή χρησιμοποιήστε είτε την επέκταση προσαρμοσμένης δέσμης ενεργειών είτε την εντολή RunCommand σε πολλές εικονικές μηχανές.

Εικονικές μηχανές που έχουν αναπτυχθεί με τη χρήση επεκτάσεων που έχουν προστατευμένες ρυθμίσεις ή διαχειριζόμενη ταυτότητα

Χρησιμοποιήστε την ακόλουθη δέσμη ενεργειών για να καταργήσετε δημόσια κλειδιά από πιστοποιητικά στα οποία η εικονική μηχανή έχει αναπτυχθεί με επεκτάσεις ή διαχειριζόμενη ταυτότητα. Αυτή η ενέργεια δεν θα καταργήσει κλειδιά που είχαν καθοριστεί κατά την ανάπτυξη μιας εικονικής μηχανής ή εάν η εικονική μηχανή είχε αναπτυχθεί με Key Vault πλήκτρα.

Σημαντικό

Συνιστούμε να δημιουργήσετε αντίγραφα ασφαλείας του αρχείου authorized_keys πριν εκτελέσετε αυτή τη δέσμη ενεργειών.

 


#!/bin/bash
set -e

# /var/lib/waagent has *.crt files that include the crt files corresponding to 
# the user provided public keys and one additional .crt file from MSI.
# This script converts the content of the .crt file into the ssh public key and
# remove it from the authorized_keys file
readarray -t CRT_FILES < <(grep -l -E "(Microsoft.ManagedIdentity|Windows Azure)" /var/lib/waagent/*.crt)
for ((i=0; i < ${#CRT_FILES[@]}; i++))
do
    PUBKEY=$(openssl x509 -in "${CRT_FILES[$i]}" -pubkey -noout | ssh-keygen -f /dev/stdin -i -m PKCS8)
    sed -i -e "\@$PUBKEY@d" $HOME/.ssh/authorized_keys
Done 

Μετά την εκτέλεση της δέσμης ενεργειών, ελέγξτε το αρχείο ssh/authorized_keys για να βεβαιωθείτε ότι υπάρχουν μόνο τα γνωστά δημόσια κλειδιά.

Εικονικές μηχανές που έχουν αναπτυχθεί με το Key Vault Secrets

Για να προσδιορίσετε αν το κλειδί προστέθηκε όταν αναπτύχθηκε με Key Vault Keys, ακολουθήστε τα εξής βήματα:

  1. Λάβετε το όνομα του πιστοποιητικού Key Vault που αναπτύξατε χρησιμοποιώντας την εικονική μηχανή, ελέγξτε τα πρότυπα κώδικα ανάπτυξης Az CLI ή ARM ή εκτελέστε αυτό το Az CLI:
     az vm show --resource-group <resourceGroupName> --name <vmName> | grep certificateUrl

    Η απάντηση θα εμφανίζει το όνομα του πιστοποιητικού:
     "certificateUrl": "https://< keyVaultname.vault.azure.net/secrets/><certName>/xxxxxxxxxxxxxxx"

  2. Λήψη του πιστοποιητικού:
     az keyvault λήψη πιστοποιητικού --vault-όνομα <keyVaultName> --όνομα <certName> --κωδικοποίηση PEM --αρχείο public.pem

  3. Εξαγωγή του δημόσιου κλειδιού:
     openSSL x509 -σε public.pm -pubkey -noout | ssh-keygen -f /dev/stdin -i -m PKCS8

  4. Συγκρίνετε την έξοδο από το προηγούμενο βήμα με τα υπόλοιπα πιστοποιητικά στο αρχείο ssh/authorized_keys.
     Αρχείο vi .ssh/authorized_keys

Επίλυση

Azure Εικόνες MarketPlace

Έχουν εφαρμοστεί επιδιορθώσεις στο cloud-init στις εικόνες που προσδιορίζονται Azure:

  • Canonical:UbuntuServer:18.04-LTS:18.04.201902190
  • Canonical:UbuntuServer:18.10-ΚΑΘΗΜΕΡΙΝΆ:18.10.201903200
  • RedHat:RHEL:7-RAW-CI:7.6.2019030421
  • OpenLogic:CentOS-CI:7-CI:7.6.20190306

Προσαρμοσμένες εικόνες

Εάν χρησιμοποιείτε προσαρμοσμένες εικόνες που παρέχονται από το cloud-init για τα γνωστά λειτουργικά συστήματα, θα πρέπει να ενημερώσετε το προσαρμοσμένο είδωλο προέλευσης.

Εικόνες Ubuntu 18.04

Για να ενημερώσετε μια προσαρμοσμένη εικόνα προέλευσης, πρέπει να κάνετε τις ακόλουθες τροποποιήσεις:

  • Επεξεργαστείτε το ακόλουθο αρχείο:

    /etc/cloud/cloud.cfg.d/90-azure.cfg

  • Προσθέστε τον παρακάτω κώδικα στο τέλος του αρχείου.

Σημαντικό

Ο κωδικός πρέπει να προστεθεί ακριβώς όπως φαίνεται, συμπεριλαμβανομένων των κενών διαστημάτων.


datasource:
   Azure:
     agent_command: [service, walinuxagent, start]

Εικόνες RHEL 7.4/7.5/7.6 και CentOS 7.6

Εάν έχετε δημιουργήσει προηγουμένως τις εικόνες RHEL/CentOS χρησιμοποιώντας αυτά τα βήματα (ή μια παρόμοια μέθοδο), πρέπει να ενημερώσετε την εικόνα προέλευσης από την οποία δημιουργήσατε τις εικονικές μηχανές. Τα παρακάτω είναι πρόσθετα βήματα που απαιτούνται για να προσθέσετε στις υπάρχουσες ρυθμίσεις παραμέτρων εικόνας εικονικής μηχανής προέλευσης:

1 βήμα 

Επεξεργαστείτε το ακόλουθο αρχείο:

/etc/cloud/cloud.cfg.d/91-azure_datasource.cfg

Σημαντικό

Ο κωδικός πρέπει να προστεθεί ακριβώς όπως φαίνεται, συμπεριλαμβανομένων των κενών διαστημάτων.

Προσθέστε τις ακόλουθες γραμμές στο τέλος του αρχείου:


datasource:
   Azure:
     agent_command: [systemctl, start, waagent, --no-block]

2 βήμα

Ενημερώστε τη ρύθμιση παραμέτρων φορέα ως εξής:


cp /lib/systemd/system/waagent.service /etc/systemd/system/waagent.service
sed -i 's/After=network-online.target/WantedBy=cloud-init.service\\nAfter=network.service systemd-networkd-wait-online.service/g' /etc/systemd/system/waagent.service
systemctl daemon-reload

Πακέτα cloud-init

Όλα τα πακέτα cloud-init που περιλαμβάνουν επιδιόρθωση βρίσκονται σε διαδικασία ενημέρωσης. Η Microsoft διερευνά αυτό το πρόβλημα και θα δημοσιεύσει περισσότερες πληροφορίες σε αυτό το άρθρο μόλις γίνουν διαθέσιμες. 

Συνήθεις ερωτήσεις

Ε1: Έχει αποκτήσει η Microsoft πρόσβαση στην εικονική μηχανή μου;

Α1: Τα κλειδιά κρυπτογράφησης χρησιμοποιούνται για τη διαχείριση ταυτοτήτων και οι επεκτάσεις δεν έχουν σχεδιαστεί για πρόσβαση από υπαλλήλους της Microsoft. Εφαρμόζουμε διαδικασίες για την παρακολούθηση, την καταγραφή και την αποτροπή αυτού του είδους της πρόσβασης. Ως προφύλαξη ασφαλείας, ελέγχουμε όλα τα αρχεία καταγραφής για να βεβαιωθούμε ότι δεν έγινε εσφαλμένη πρόσβαση σε κλειδιά πελάτη. Για τα πιστοποιητικά που είναι αποθηκευμένα σε Key Vault τα οποία αναφέρονται σε μια ανάπτυξη VM ή VMSS, οι υπάλληλοι της Microsoft δεν έχουν πρόσβαση στα μυστικά.

Ε2: Επηρεάζονται όλα τα λειτουργικά συστήματα και οι εκδόσεις που έχουν αναπτυχθεί στο cloud;

Α2: Όχι. Έχουμε δει αυτό το εξωγενές βασικό ζήτημα να εμφανίζεται μόνο στα αναγνωρισμένα λειτουργικά συστήματα. Δεν το έχουμε δει να συμβαίνει σε παλαιότερες εκδόσεις του Ubuntu. Αυτό συμβαίνει επειδή αυτά τα συστήματα χρησιμοποιούν διαφορετικό μηχανισμό για τον ορισμό δημόσιων κλειδιών.

Ε3: Τα επηρεαζόμενα πακέτα cloud-init για τις διανομές Linux περιλαμβάνουν την επιδιόρθωση;

Α3: Εργαζόμαστε για την προσθήκη των επιδιορθώσεων στα πακέτα για τις επηρεαζόμενες εκδόσεις και θα ενημερώσουμε αυτό το άρθρο όταν ολοκληρωθεί αυτή η εργασία.

Ε4: Η Microsoft θα ενημερώσει αυτόματα τις επηρεαζόμενες εικονικές μηχανές;

Α4: Όχι. Η Microsoft δεν θα αλλάξει τα περιεχόμενα των εικονικών μηχανών που έχετε ήδη προμηθεύσει.

Ε5: Οι πολιτικές ασφαλείας μας δεν μου επιτρέπουν να λειτουργήσω μια εικονική μηχανή Linux με ξένο περιεχόμενο στο authorized_keys. Τι μπορώ να κάνω γι' αυτό σήμερα;

Α5: Μπορείτε να αφαιρέσετε την προσβλητική γραμμή με ασφάλεια από το αρχείο authorized_keys. Αυτό δεν θα επηρεάσει ούτε το ζεύγος κλειδιών SSH που δημιουργήσατε και ελέγχετε ούτε τη διαχειριζόμενη ταυτότητα. Μπορείτε να το κάνετε αυτό μη αυτόματα ή εκτελώντας μια προσαρμοσμένη δέσμη ενεργειών ή μια προσαρμοσμένη εντολή σε οποιονδήποτε επηρεαζόμενο στόλο.