فصل ۷: مدیریت و امنیت — کاربران، بکاپ، Replication و کد سمت سرور

احراز هویت caching_sha2_password، TLS و کلاینت‌های قدیمی

چرا برنامه‌ی قدیمی بعد از ارتقا وصل نمی‌شود؟

از MySQL 8.0 پلاگین پیش‌فرض احراز هویت caching_sha2_password است که از SHA-256 و نمک استفاده می‌کند و بسیار امن‌تر از mysql_native_password قدیمی (SHA-1) است. کلاینت‌های قدیمی مثل PHP پیش از 7.4، Connector/J سری 5.1، نسخه‌های قدیمی Navicat یا نرم‌افزارهای حسابداری ده سال پیش این پلاگین را نمی‌شناسند و با پیام‌هایی مثل Authentication plugin 'caching_sha2_password' cannot be loaded یا The server requested authentication method unknown to the client شکست می‌خورند.

در MySQL 8.4 پلاگین قدیمی به‌طور پیش‌فرض غیرفعال است و در نسخه‌های 9 کاملاً حذف شده؛ پس راه درست، ارتقای کلاینت است و فعال کردن پلاگین قدیمی فقط یک راه موقت.

-- چه کسی با چه پلاگینی وارد می‌شود؟
SELECT user, host, plugin FROM mysql.user;

-- راه موقت برای یک نرم‌افزار قدیمی (در 8.4 اول در my.cnf بنویسید: mysql_native_password=ON)
ALTER USER 'legacy_erp'@'10.0.0.40'
  IDENTIFIED WITH mysql_native_password BY 'Temp-Secret-Until-Upgrade';

-- اجبار رمزنگاری برای یک کاربر یا کل سرور
ALTER USER 'sara_bi'@'10.0.0.25' REQUIRE SSL;
SET PERSIST require_secure_transport = ON;

caching_sha2 چطور کار می‌کند

اولین ورود هر کاربر باید روی کانال امن انجام شود: TLS، سوکت یونیکس یا تبادل رمز با کلید عمومی RSA سرور. پس از ورود موفق، چکیده‌ی رمز در حافظه‌ی سرور cache می‌شود و ورودهای بعدی سریع‌اند. این cache با ری‌استارت سرور خالی می‌شود؛ به همین دلیل گاهی برنامه‌ای که هفته‌ها بدون TLS کار می‌کرد، بعد از ری‌استارت با Authentication requires secure connection قطع می‌شود.

mysql -h 10.0.0.11 -u web -p --ssl-mode=VERIFY_CA --ssl-ca=/etc/mysql/ca.pem
# اگر TLS ندارید (فقط در شبکه‌ی داخلی مطمئن):
mysql -h 10.0.0.11 -u web -p --get-server-public-key

در JDBC معادل گزینه‌ی دوم allowPublicKeyRetrieval=true است.

حالت‌های TLS در کلاینت

ssl-modeرمزنگاریبررسی هویت سرور
PREFERRED (پیش‌فرض)اگر سرور پشتیبانی کندخیر
REQUIREDاجباریخیر
VERIFY_CAاجباریگواهی توسط CA شما امضا شده باشد
VERIFY_IDENTITYاجباریCA و تطابق نام میزبان

MySQL 8 در اولین راه‌اندازی گواهی self-signed می‌سازد، پس اتصال‌ها معمولاً رمز شده‌اند؛ اما بدون VERIFY_CA جلوی حمله‌ی مرد میانی گرفته نمی‌شود. برای دیدن وضعیت اتصال فعلی: SHOW SESSION STATUS LIKE 'Ssl_cipher';

نکته‌هایی که کمتر کسی می‌داند

  • اتصال با سوکت (host برابر localhost در لینوکس) امن حساب می‌شود؛ برای همین caching_sha2 روی خود سرور بی‌دردسر است و از ماشین دیگر خطا می‌دهد.
  • چرخش رمز بدون قطعی: ALTER USER 'web'@'10.0.0.%' IDENTIFIED BY 'New' RETAIN CURRENT PASSWORD; سپس برنامه‌ها را یکی‌یکی به‌روز کنید و در پایان ALTER USER ... DISCARD OLD PASSWORD;
  • متغیر default_authentication_plugin منسوخ شده و در 8.4 وجود ندارد؛ جایگزینش authentication_policy است.
  • رمز را در اسکریپت‌های cron ننویسید؛ mysql_config_editor set --login-path=backup ... آن را در فایل مبهم‌شده‌ی .mylogin.cnf نگه می‌دارد و با --login-path=backup استفاده می‌شود.
  • کامپوننت validate_password با INSTALL COMPONENT 'file://component_validate_password'; نصب می‌شود و رمزهای ضعیف را در CREATE USER رد می‌کند.

برای ذخیره‌ی پیشرفت و شرکت در آزمون، وارد شوید — رایگان است.