Hotfixed ESET Protect Login failed: Connection has failed with state “loginConnectionStateNotConnected”

ESET PROTECT อยู่ดี ๆ ก็เกิดปัญหา login ไม่ได้ซะอย่างงั้น แจ้งเตือน Login failed: Connection has failed with state "loginConnectionStateNotConnected" ลองหาวิธีแก้ไขจากเว็บของ ESET แล้วไม่ได้ผล ลองมาหลายวิธีจนเจอทางของตัวเอง ตามนี้

SYSTEM IN THIS CASE

  • CentOS Linux release 7.9.2009 (Core)
  • ESET PROTECT (Server), Version 10.0 (10.0.2133.0)
  • mysql Ver 8.0.32 for Linux on x86_64 (MySQL Community Server – GPL)
  • MySQL ODBC 8.0.17

ตรวจสอบ log files

เพื่อหาว่ามันเกิดปัญหาจากอะไร เราควรเริ่มต้นจากการดู log ให้แน่ชัด ในเบื้องต้นดู log ของ ESET ก่อนแล้วค่อยไล่ไปเรื่อยๆ เริ่มต้นจาก EraServerInstaller.log

tail /var/log/eset/RemoteAdministrator/EraServerInstaller.log
2022-11-28 02:43:57 Information: GetDatabaseServerConnectionStringWithoutEscape: Created connection string: 'Driver=MySQL ODBC 8.0.17;Server=localhost;Port=3306;User=******;Password={******};CharSet=utf8;NO_LOCALE=1;NO_SSPS=1;'
2022-11-28 02:43:57 Information: CGuidManager: Could not connect to the database. Exception error code: 1045, error message: [unixODBC][MySQL][ODBC 8.0(w) Driver]Access denied for user 'erauser'@'localhost' (using password: YES)
2022-11-28 02:43:57 Information: GetProductGuid: GUID was NOT loaded from the database. Loading GUID from the property...
2022-11-28 02:43:57 Information: GetProductGuid: Final choice of GUID is: 0263fc52-9b1f-4b59-abf0-1e9eae6be121
2022-11-28 02:43:57 Information: Entering function: void Era::Setup::Common::CustomActions::CDatabaseWrapper::UpgradeDatabase(const string&, const string&, const string&, const string&)
2022-11-28 02:43:57 Information: Leaving function: void Era::Setup::Common::CustomActions::CDatabaseWrapper::UpgradeDatabase(const string&, const string&, const string&, const string&)
2022-11-28 02:43:57 Error: [unixODBC][MySQL][ODBC 8.0(w) Driver]Access denied for user 'erauser'@'localhost' (using password: YES)
2022-11-28 02:43:57 Error: DbUpgrade: [unixODBC][MySQL][ODBC 8.0(w) Driver]Access denied for user 'erauser'@'localhost' (using password: YES)
2022-11-28 02:43:57 Information: Installer: Failed upgrading database.
2022-11-28 02:43:57 Information: Installer: Error: 2484: Error occurred while upgrading database

ข้ามไปได้เพราะไม่มี error ที่วันที่ใกล้เคียงกับปัจจุบัน อันดับต่อมาดูใน trace.log

tail /var/log/eset/RemoteAdministrator/Server/trace.log
2023-06-26 04:23:08 Information: Kernel [Thread 7f097d1bf740]: Used memory before modules load and initialization is 82308 KB
2023-06-26 04:23:08 Information: Kernel [Thread 7f097d1bf740]: Initializing module CTranslatorModule
2023-06-26 04:23:08 Information: CTranslatorModule [Thread 7f097d1bf740]: Registering translator resource
2023-06-26 04:23:08 Information: CTranslatorModule [Thread 7f097d1bf740]: Module successfully initialized
2023-06-26 04:23:08 Information: Kernel [Thread 7f097d1bf740]: Initialized module CTranslatorModule (used 256 KB) initialization took 0 milliseconds
2023-06-26 04:23:08 Information: Kernel [Thread 7f097d1bf740]: Initializing module CUpdatesModule
2023-06-26 04:23:08 Information: Kernel [Thread 7f097d1bf740]: Initialized module CUpdatesModule (used 540 KB) initialization took 0 milliseconds
2023-06-26 04:23:08 Information: Kernel [Thread 7f097d1bf740]: Initializing module CDatabaseModule
2023-06-26 04:23:08 Information: CDatabaseModule [Thread 7f097d1bf740]: Startup configuration builder builds successfully ...
2023-06-26 04:23:08 Error: CDatabaseModule [Thread 7f097d1bf740]: Probing database connection failed. Next connection attempt will be in 10 seconds. 11 more attempts will be made. The database access layer reported: [unixODBC][Driver Manager]Can't open lib '/usr/lib64/libmyodbc8w.so' : file not found (0)

พบปัญหาคือ มันเชื่อมต่อกับฐานข้อมูลไม่ได้ เนื่องจากไม่พบไฟล์ [unixODBC][Driver Manager]Can't open lib '/usr/lib64/libmyodbc8w.so' : file not found (0) ตัวนี้เราจะติดตั้งในส่วนของ ODBC connector สำหรับ MySQL 8.0.x

เมื่อพบว่าเกิดปัญหาจากการเชื่อมต่อฐานข้อมูลไม่ได้ ลองไปดู mysqld.log ด้วยว่าเกิดปัญหาอะไรขึ้น

tail /var/log/mysqld.log
2023-06-26T08:18:06.549010Z 0 [System] [MY-013172] [Server] Received SHUTDOWN from user <via user signal>. Shutting down mysqld (Version: 8.0.32).
2023-06-26T08:18:07.404479Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.32)  MySQL Community Server - GPL.
2023-06-27T12:39:30.070475Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.32) starting as process 1671
2023-06-27T12:39:30.145238Z 0 [Warning] [MY-013907] [InnoDB] Deprecated configuration parameters innodb_log_file_size and/or innodb_log_files_in_group have been used to compute innodb_redo_log_capacity=314572800. Please use innodb_redo_log_capacity instead.
2023-06-27T12:39:30.151868Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2023-06-27T12:39:30.600561Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2023-06-27T12:39:30.891264Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2023-06-27T12:39:30.891303Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
2023-06-27T12:39:30.926868Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock
2023-06-27T12:39:30.926954Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.32'  socket: '/var/lib/mysql/mysql.sock'  port: 3306  MySQL Community Server - GPL.

ไม่พบ Error เจอแต่ Warning แสดงว่าฐานข้อมูลปกติอยู่ จากการตรวจสอบ log พบว่าเป็นที่ ODBC ซึ่งอาจจะต้องลงใหม่

ติดตั้ง ODBC ใหม่

อ้างอิงจาก : https://support.eset.com/en/kb7838-install-eset-protect-on-centos-7#odbc

  1. Install unixODBC drivers.
sudo yum install unixODBC -y
  1. Download the file directly. Do not install the driver using YUM as it will not install the latest compatible version.
wget https://downloads.mysql.com/archives/get/p/10/file/mysql-connector-odbc-8.0.17-1.el7.x86_64.rpm
  1. Install the ODBC driver.
sudo rpm -ivh mysql-connector-odbc-8.0.17-1.el7.x86_64.rpm --nodeps
  1. Setup the ODBC driver.
sudo myodbc-installer -a -d -n "MySQL ODBC 8.0.17" -t "Driver=/usr/lib64/libmyodbc8w.so"
  1. List the installed drivers:
sudo myodbc-installer -d -l

ติดตั้ง ESET PROTECT ใหม่

เนื่องจากในกรณีนี้ติดตั้ง ODBC แล้วยังไม่สามารถ start service ของ ESET PROTECT ได้ ซึ่งเหมือนกับว่า driver ที่ติดตั้งไปใหม่ ในเคสนี้ผมลองติดตั้ง ESET PROTECT ใหม่แล้ว พบว่า start ขึ้นมาได้เพียง 10 วินาที ก็ Active: failed ซึ่งเป็นไปตาม error ของ ODBC ที่พบว่ามีการเชื่อมต่อซ้ำๆ กันเข้าไปภายใน 10 วินาที จน connection error ทำให้ผมย้อนกลับไปติดตั้ง ODBC ก่อน หลังจากนั้นมาติดตั้ง ESET PROTECT ซ้ำอีกครั้ง

sudo systemctl restart eraserver
● eraserver.service - ESET PROTECT Server
   Loaded: loaded (/etc/systemd/system/eraserver.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Tue 2023-06-27 08:49:41 EDT; 14s ago
  Process: 1830 ExecStart=/opt/eset/RemoteAdministrator/Server/ERAServer --daemon --pidfile /var/run/eraserver.pid (code=exited, status=0/SUCCESS)
 Main PID: 1831 (code=exited, status=70)

Jun 27 08:49:41 ath15 systemd[1]: Starting ESET PROTECT Server...
Jun 27 08:49:41 ath15 systemd[1]: Can't open PID file /var/run/eraserver.pid (yet?) after start: No such file or directory
Jun 27 08:49:41 ath15 systemd[1]: Started ESET PROTECT Server.
Jun 27 08:49:41 ath15 systemd[1]: eraserver.service: main process exited, code=exited, status=70/n/a
Jun 27 08:49:41 ath15 systemd[1]: Unit eraserver.service entered failed state.
Jun 27 08:49:41 ath15 systemd[1]: eraserver.service failed.

ขั้นตอนการติดตั้งซ้ำ ให้ข้ามไปขั้นที่ 3 เลย

Install the Server component of ESET PROTECT

  1. Download the ESET PROTECT Server installer.
wget https://download.eset.com/com/eset/apps/business/era/server/linux/latest/server-linux-x86_64.sh
  1. Configure the server installation file set as an executable.
chmod +x server-linux-x86_64.sh
  1. Create the temporary installer script.
touch installer.sh
  1. Open the temporary script and paste the following code:
sudo ./server-linux-x86_64.sh \
--skip-license \
--db-type="MySQL Server" \
--db-driver="MySQL ODBC 8.0.17" \
--db-hostname=localhost \
--db-port=3306 \
--db-admin-username=root \
--db-admin-password=password form step II.12. \
--server-root-password=password \
--db-user-username=erauser \
--db-user-password=strong complex password \
--cert-hostname="hostname, IP, FQDN"
  1. Modify the code in the file to fit your installation, including the hostname and IP address of your machine. Use the IP address that agent machines will use to reach the Server machine. Make sure to set up a complex db-user-password. A weak password will cause the installation to fail.
  2. Run the installer script.
sudo sh installer.sh
  1. The installation may end with SELinux policy... failure. That can be ignored if you do not use SELinux.
  2. Start the ESET PROTECT Server service.
sudo systemctl start eraserver
sudo systemctl status eraserver

You should see that the service is active.

สรุป

ในเคสนี้ผมทำอยู่ 2 วัน เพื่อหาว่าจริงๆ แล้วมันเกิดจากอะไร โดยเริ่มแรกได้ลอง restore กลับมาจาก backup แต่ก็ไม่สามารถ start ได้ ไม่ว่าจะ restore ไป 10 วันที่แล้วก็ตาม จึงต้องหาวิธีการแก้ไขปัญหาที่ต้นเหตุ โดยเริ่มต้นการ recovery ข้อมูลของวันล่าสุด ก่อนที่จะพบว่าเข้าใช้งานไม่ได้ เรื่องจากเป็นตอนที่ระบบไม่ได้ถูกเข้าไปยุ่ง หรือ ทำอะไรก่อนหน้านี้ จากนั้นเริ่ม snapshot เพื่อบันทึกกระบวนการไว้ ไม่ให้หาย เรียกว่า “จุดเซฟ” ก็แล้วกัน ลองทำอยู่หลายวิธี อ้างอิงจากหลายๆ คู่มือ หลายๆ KB จนออกมาในรูปแบบของการติดตั้ง ODBC ใหม่แค่นั้น