+1

series Opcodes Log Viewer Thực chiến #1: Cài đặt và Xây dựng Phòng tuyến Bảo mật Đa lớp

1. Cài đặt và Publish Cấu hình

Đầu tiên, kéo package này về hệ thống Laravel của bạn:

composer require opcodesio/log-viewer

Với các dự án Enterprise, bạn tuyệt đối không bao giờ được phép xài cấu hình mặc định (phụ thuộc vào vendor). Phải đẩy file config ra ngoài để kiểm soát toàn diện:

php artisan log-viewer:publish

php artisan vendor:publish --tag="log-viewer-config"

Lệnh này sẽ sinh ra file config/log-viewer.php. Đây sẽ là trung tâm điều khiển phòng thủ của chúng ta.

2. Chốt chặn 1: Tùy biến Đường dẫn (Obscurity Security)

Mặc định, package này sẽ tạo ra một route là your-domain.com/log-viewer. Điều này cực kỳ nguy hiểm vì Hacker thường xuyên dùng các công cụ quét tự động (DirBuster) để dò tìm các URL mặc định như /log-viewer, /phpmyadmin, /telescope.

Chuẩn Senior: Hãy đổi URL này thành một chuỗi khó đoán, hoặc giấu nó sau một tiền tố của hệ thống quản trị. Mở config/log-viewer.php và tìm dòng route_path:

// KHÔNG DÙNG: 'route_path' => 'log-viewer',
    
    // NÊN DÙNG: Giấu nó vào một đường dẫn sâu, hoặc kết hợp chuỗi hash
    'route_path' => 'admin-core/system-diagnostics/logs-monitor',

3. Chốt chặn 2: Ủy quyền Tối cao (Authorization Gate)

Theo mặc định, Log Viewer cho phép tất cả mọi người truy cập nếu ở môi trường local, và khóa hoàn toàn ở môi trường production. Để mở khóa trên Production một cách an toàn, bạn phải định nghĩa rõ Ai mới có quyền xem log?

Hãy mở app/Providers/AppServiceProvider.php (hoặc tạo một LogViewerServiceProvider), và đăng ký chốt chặn Auth vào hàm boot():

use Opcodes\LogViewer\Facades\LogViewer;
use Illuminate\Support\Facades\Gate;

public function boot(): void
{
    LogViewer::auth(function ($request) {
        // 1. Nếu môi trường Local, cho phép Dev xem thoải mái
        if (app()->environment('local')) {
            return true;
        }

        // 2. Bắt buộc phải đăng nhập (Không có User -> Cút)
        if (!$request->user()) {
            return false;
        }

        // 3. Chỉ những User có role là 'super_admin' hoặc 'devops' mới được vào
        return $request->user()->hasRole(['super_admin', 'devops']);
    });
}

Nhờ chốt chặn này, kể cả một Quản lý ga (Admin thông thường) vô tình biết được đường dẫn, họ cũng sẽ bị đá văng ra ngoài bằng lỗi 403 (Forbidden). Chỉ có kỹ sư hệ thống nắm quyền lực tối cao mới được phép tiếp cận.

4. Chốt chặn 3: Hàng rào IP Whitelisting (Mạng nội bộ)

Chỉ kiểm tra quyền User đôi khi là chưa đủ an toàn. Nếu máy tính của kỹ sư DevOps bị nhiễm mã độc, hoặc họ bị lộ mật khẩu, Hacker vẫn có thể dùng tài khoản đó đăng nhập từ bên ngoài quán cà phê.

Chuẩn Enterprise: Màn hình cấu hình hệ thống lõi chỉ được phép truy cập từ dải IP nội bộ của công ty (Intranet/VPN).

Chúng ta tiếp tục gia cố thêm logic kiểm tra IP ngay bên trong hàm auth():

use Opcodes\LogViewer\Facades\LogViewer;

public function boot(): void
{
    LogViewer::auth(function ($request) {
        if (app()->environment('local')) {
            return true;
        }

        // Danh sách các IP an toàn (IP của văn phòng công ty, VPN công ty, v.v.)
        $allowedIps = [
            '192.168.1.100', // IP VPN văn phòng
            '118.69.123.45', // IP tĩnh Public của trụ sở chính
        ];

        if (!in_array($request->ip(), $allowedIps)) {
            // Ghi cảnh báo có kẻ cố tình truy cập từ IP lạ
            \Log::warning("Cảnh báo an ninh: Cố gắng truy cập Log Viewer từ IP lạ - " . $request->ip());
            return false;
        }

        // Vượt qua vòng IP thì mới xét tiếp vòng User Role
        return $request->user() && $request->user()->hasRole(['super_admin', 'devops']);
    });
}

Tổng kết Bài 1

Với 3 chốt chặn kiên cố: Đường dẫn bí mật + Phân quyền cấp cao + Hàng rào IP, màn hình Log Viewer của bạn giờ đây đã an toàn như một boong-ke quân sự. Bạn có thể tự tin đẩy tính năng này lên Production để team Backend dễ dàng monitor lỗi mà không sợ đêm nằm ngủ bị giật mình thon thót vì sợ lộ mã nguồn.

Tuy nhiên, dù đã khóa chặt cửa, đôi lúc chính các kỹ sư nội bộ khi xem log lại vô tình chụp màn hình (screenshot) và để lọt cấu hình nhạy cảm. Ở Bài 2, bạn muốn chúng ta đi sâu vào kỹ thuật Che giấu dữ liệu nhạy cảm (Data Masking/Redaction) ngay trong Log Viewer để bôi đen tự động các chuỗi Mật khẩu/Token, hay muốn học cách tích hợp Log Viewer để giám sát và tải log của nhiều server (Multi-server) cùng một lúc?


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí