Πρόσβαση με PHP στο Exchange/Office 365

Από καιρό ανακοινώθηκε - τώρα πραγματικότητα : Η Microsoft έχει απενεργοποιήσει τον έλεγχο ταυτότητας με κωδικό πρόσβασης για ορισμένα πρωτόκολλα στο Exchange Online από τον Σεπτέμβριο του 2022 υπέρ του oAuth2. Τα ζητήματα του GitHub πολλών βιβλιοθηκών και σεναρίων αντιγράφων ασφαλείας καθιστούν σαφές ότι η αλλαγή αιφνιδίασε πολλούς διαχειριστές. Παρακάτω παρουσιάζουμε έναν τρόπο με τον οποίο μπορείτε να συνεχίσετε να έχετε πρόσβαση στα περιεχόμενα του γραμματοκιβωτίου Exchange με τη βοήθεια του oAuth2 μέσω PHP μέσω IMAP.


Από πλευράς ασφάλειας, η κίνηση της Microsoft είναι πολύ σωστή, αλλά η πολυπλοκότητα της πρόσβασης μέσω προγραμματισμού στα e-mail της έχει αυξηθεί αρκετά. Για παράδειγμα, εάν χρησιμοποιείτε την ευρέως χρησιμοποιούμενη βιβλιοθήκη barbushin/php-imap , η πρόσβαση ήταν ως εξής:

734a82898010e2fcb02c72c3cd9702c2

Απλώς δεν λειτουργεί πια. Για να δημιουργήσετε μια σύνδεση μέσω oAuth2, η πρώτη δυσκολία είναι να αποκτήσετε το διακριτικό πρόσβασης. Και για αυτό πρέπει να αντιμετωπίσετε δύο εμπόδια.

Azure Active Directory

Τα παρακάτω βήματα καταγράφουν μια νέα εφαρμογή στην υπηρεσία καταλόγου Active Directory του Azure:

Συνδεθείτε στο https://portal.azure.com
Ανοίξτε το "Azure Active Directory"
Επιλέξτε "Εγγραφές εφαρμογών" & "Νέα εγγραφή".
Αντιγράψτε "Αναγνωριστικό εφαρμογής (Πελάτης)" (=Αναγνωριστικό πελάτη) & "Αναγνωριστικό καταλόγου (Μισθωτής)" (=Αναγνωριστικό ενοικιαστή).
"Δικαιώματα API" & "Προσθήκη άδειας"
"API που χρησιμοποιούνται από τον οργανισμό μου" & "Office 365 Exchange Online"
"Δικαιώματα εφαρμογής" & "IMAP.AccessAsApp"
Εκχώρηση συγκατάθεσης διαχειριστή
"Πιστοποιητικά & Μυστικά" & "Μυστικά Πελατών" & "Μυστικό Νέου Πελάτη"
Επιλέξτε περιγραφή και ορίστε την εγκυρότητα
Αντιγράψτε το "Secret ID" (Client Secret) στο πρόχειρο
Ανοίξτε εταιρικές εφαρμογές
Αντιγράψτε το "Αναγνωριστικό αντικειμένου".

PowerShell

Τώρα γυρίζουμε την εφαρμογή στο Microsoft PowerShell (Λειτουργία διαχειριστή) και εκχωρήστε δικαιώματα στα μεμονωμένα γραμματοκιβώτια (<TENANTID>, <CLIENTID>, <OBJECTID>, <EMAIL> πρέπει να αντικατασταθεί σε κάθε περίπτωση):

Install-Module -Name ExchangeOnlineManagement
Import-Module ExchangeOnlineManagement
Connect-ExchangeOnline -Organization <TENANTID>

New-ServicePrincipal -AppId <CLIENTID> -ServiceId <OBJECTID>
Add-MailboxPermission -Identity "<EMAIL>" -User <OBJECTID> -AccessRights FullAccess
...

Μόλις το κάνετε αυτό, τα υπόλοιπα δεν είναι επιστήμη πυραύλων. Επειδή το barbushin/php-imap δεν υποστηρίζει oAuth2, μπορείτε να συνδεθείτε με την εναλλακτική βιβλιοθήκη Webklex/php-imap (η οποία έχει επίσης το πλεονέκτημα ότι δεν απαιτεί τη λειτουργική μονάδα PHP IMAP ).:

734a82898010e2fcb02c72c3cd9702c2

Ωστόσο, οι βιβλιοθήκες που δεν υποστηρίζουν επίσημα το oAuth2 μπορούν επίσης να χρησιμοποιηθούν με διακομιστή μεσολάβησης όπως π.χ simonrob/email-oauth2-proxy καταστήστε το λειτουργικό. Μετά από αυτό Κατεβάστε και η εγκατάσταση μέσω python -m pip install -r requirements-no-gui.txt (απαιτείται Python ≥ 3.6) επεξεργάζεστε το αρχείο emailproxy.config π.χ. ως εξής (αντικαθιστώντας αυτή τη φορά <TENANTID>, <CLIENTID>, <CLIENTSECRET> και <EMAIL>):

[Server setup]

[IMAP-1993]
local_address = localhost
server_address = outlook.office365.com
server_port = 993

[Account setup]

[<EMAIL>]
token_url = https://login.microsoftonline.com/<TENANTID>/oauth2/v2.0/token
oauth2_scope = https://outlook.office365.com/.default
redirect_uri = http://localhost:8080
client_id = <CLIENTID>
client_secret = <CLIENTSECRET>

Στη συνέχεια ξεκινάτε τον διακομιστή μεσολάβησης με python emailproxy.py --no-gui και τώρα μπορεί να μεταβεί στην IP χωρίς κρυπτογράφηση localhost στο λιμάνι 1993 συνδεθείτε μέσω του κανονικού Basic Auth (και οποιουδήποτε κωδικού πρόσβασης). Εάν θέλετε να ξεκινήσετε τον διακομιστή μεσολάβησης ως υπηρεσία στο παρασκήνιο κατά την εκκίνηση του συστήματος, μπορείτε να χρησιμοποιήσετε, για παράδειγμα systemd:

sudo systemctl edit --force --full emailproxy.service

[Unit]
Description=Email OAuth 2.0 Proxy
[Service]
ExecStart=/usr/bin/python /path/to/emailproxy.py --no-gui
Restart=always
[Install]
WantedBy=multi-user.target

sudo systemctl enable emailproxy.service --now
sudo systemctl status emailproxy.service
sudo systemctl start emailproxy.service

Εάν απαιτείται κρυπτογραφημένη σύνδεση, αυτό είναι επίσης δυνατό - για αυτό δημιουργείτε πρώτα ένα ιδιωτικό κλειδί και ένα αυτο-υπογεγραμμένο πιστοποιητικό:

openssl genrsa -out key.pem 3072
openssl req -new -x509 -key key.pem -out cert.pem -days 360

Στη συνέχεια γίνεται αναφορά στο emailproxy.config αυτά τα δύο αρχεία:

local_key_path = /path/to/key.pem
local_certificate_path = /path/to/cert.pem
Πίσω