跳到主要內容

發表文章

目前顯示的是有「伺服器」標籤的文章

SSH Tunnel(Port Forwarding)的應用

自己在管理伺服器和防火牆原則是最小開放原則,一定需要的服務 port 才會開放,例如網頁伺服器的 80、443 等。而管理用的 ssh ,可以的話就限縮來源 IP 範圍,加上限制可以登入的帳號或群組,要不然就改 port 編號;不過,改 port 編號會變成自己在遠端登入時要回想是改成多少,有點不是很方便。 所以最近建置的伺服器就不改 port 了,會加上 fail2ban 的防衛機制。 因為最小開放原則,像是 webmin(10000)這樣的 port 就不會開放,如果想要用的話,就用 ssh tunnel 方式作跳板連接。 例如伺服器的 public ip:123.123.123.123,要連 webmin 的話,就用: ssh 123.123.123.123 -L 10000:127.0.0.1:10000 SSH 登入後就會在客戶端開啟 127.0.0.1:10000 的監聽埠,用瀏覽器連本機的 127.0.0.1:10000 就會跳到伺服器端的 10000 埠。 一直以來,我都以為 ssh -L (Local Port Forwarding)方式只會在本機端綁定 127.0.0.1:xxxx的情形。不過,最近因為要解決一個臨時伺服器的設定問題,才發現原來不是只能綁在 127.0.0.1 上。 網路架構: 外部 public ip:123.123.123.0/24 內部 private ip:10.1.0.0/16 內部切出多個 class C的網路區域,其中 10.1.1.0/24 是 ServerZone,在外面用 DNAT 的方式將服務要求導入內部的伺服器。 其他 10.1.n.0/24 是各個區域內容IP,只能 NAT 出去,外部不能訪問到。 需求: Server-01:10.1.1.2,Server-02:10.1.20.2 Server-01在 ServerZone 內,從外部可以訪問,Server-02 在 PrivateZone 內,外部連不到。ServerZone 和 PrivateZone 彼此可以 SSH 互連。 現在希望可以在不變動兩台 Server 的 IP 區域,讓 Server-02可以被外部訪問到。 最簡單的方式就是先登 Server-01後,再從 Server-01 terminal 登到 Server-02上。但是需求是,...

Ubuntu 安裝 Mariadb (新)

參考資料: 如何在 Ubuntu 22.04 上安裝和設定 MariaDB 紀錄安裝 MariaDB的過程及安全設定 1、更新系統 sudo apt update sudo apt upgrade 2、安裝 MariaDB 所需軟體 sudo apt-get install wget software-properties-common dirmngr ca-certificates apt-transport-https -y 安裝主系統 sudo apt install mariadb-server mariadb-client 檢查版本 mariadb --version 檢查伺服器狀態 systemctl status mariadb 3、安全性設定 sudo mysql_secure_installation 4、建立管理員帳戶 GRANT ALL ON *.* TO 'admin'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION; FLUSH PRIVILEGES;

PhpSpreadsheet 從 Cell 中取值的注意事項

最近在做一個報名系統,需要開放由 Excel 格式報名表上傳報名資料。這項技術之前已有在別的系統上實作過了,是使用 \PhpOffice\PhpSpreadsheet 套件處理上傳的 Excel 檔案,所以把舊的程式套用過來修改即可。 但是在測試的時候,發現部份欄位取值後的資料有問題,一查原來是 Excel 儲存格(Cell)中有設定格式,此時這個儲存格變成 Richtext Cell,在 PhpSpreadsheet 中用 getValue() 取值時,會取出一堆格式的資訊。 在查閱了一些資料後,似乎沒有一個萬用的取值函數,必須要判斷取出的資料是否為 Richtext,若是 Richtext 格式,需要再用 getPlaintext() 函數去把文字內容取出。 如此,在取出每一個儲存格內容後,都有用一個 if 來判斷取出的資料類型後再處理,真的有夠麻煩。還好這次系統要取的欄位沒有很多,萬一未來遇到很多的資料時,一堆 IF 一定會 keyin 在累死,而且程式執行效率也一定會變慢。 有空再來研究看看,有沒有比較省力的方法吧。

手工 PHP CSRF 實作

現在自己寫程式都已經使用 CodeIgniter4 的 PHP 套件,系統會自動使用資安防護機制,如網路表單會使用 CSRF (cross-site request forgery)的機制保護,以防止不合法的資料輸入或程式機器人入侵。 但在之前未使用 CI4 之前的程式,如果要防止相關資訊安全漏洞的話,必要自己手工增加 CSRF 防護。 CSRF 產生: $_SESSION['token'] = md5(uniqid(mt_rand(), true)); 在表單添加 CSRF 隱藏欄位: <input type="hidden" name="token" value="<?php echo $_SESSION['token'] ?? '' ?>"> 在後續程序驗證 CSRF: $token = filter_input(INPUT_POST, 'token', FILTER_SANITIZE_STRING); if (!$token || $token !== $_SESSION['token']) {     // return 405 http status code     header($_SERVER['SERVER_PROTOCOL'] . ' 405 Method Not Allowed');     exit; } else {     // process the form }

CodeIgniter4 使用 Firebase 進行認證

  前置動作 完成 Firebase 專案設定,並新增好使用的應用程式(必須是網頁程式</>) 產生並下載保存服務帳號金鑰檔案(JSON) 備註:此金鑰JSON檔只能產生一次,若再次點選產生金鑰會產出另一份金鑰內容 安裝 在 CodeIgniter4 專案中安裝 firebase-php: composer require " kreait/firebase-php:^7.0 " 備註:firebase-php 7.0 僅支援 php 8,所以如果使用 php 其他版本就不要加上最後面的 :^7.0,composer 會自動使用 6.9 版 將服務帳號金鑰JSON檔案置於網站系統內,例如將json檔置於網站的/cert資料夾中 設定 在 .env 檔案中加入金鑰檔案的路徑 以 javascript 進行認證服務 登入頁製作 網頁加入相關資訊 PHP 認證處理 說明: 1. /auth/login 登入頁中,使用 Google 認證按鈕後,會進入 firebase 認證程序,認證完成後將轉址至 /auth/callback/?token=..... 2. 在 /auth/callback 程序中,認證使用者資料且取得權限後,存入 session 再轉至 /admin 管理頁 3. 在 firebase 使用者資料中,可以利用 customClaim 欄位來儲存額外的資訊。

Mysql 新增使用者

 單純新增使用者 create user 'username'@'localhost' identified by 'password'; 新增權限使用者 grant all privileges on *.* to 'username'@'localhost' identified by 'password' with grant option;

Ubuntu 22.04 安裝PHP 7.4

目前最新的 Ubuntu LTS 是 22.04 版,其預設的套件庫 PHP 是 8.1 版本。 相較於 Ubuntu 20.04 用的是 PHP7.4,PHP8.1對於變數的宣告和陣列的 KEY 值有很嚴格的限制,未事前宣告的變數或陣列 KEY值就會報錯。如果是小一點的程式,在報錯的地方再針對變數和KEY 多做一個判斷可以解決;但是大一點的程式就很傷腦筋了。 網路上有提供新增套件庫,將原本的 PHP8.1 降級成 PHP7.4 的方法,以前設定時還蠻順利的,但是最近新設定一台虛擬主機時,欲一直遇到 python 的問題,最後利用手動增加套件庫的方式才解決這個問題。 參考資料: https://askubuntu.com/questions/1393381/unable-to-add-ondrej-repository-apt-in-ubuntu-20-04 1、在 /etc/apt/source.d 中新增 ondrej-ubuntu-php-jammy.list 2、在 ondrej-ubuntu-php-jammy.list 中新增: deb https://ppa.launchpadcontent.net/ondrej/php/ubuntu/ jammy main # deb-src https://ppa.launchpadcontent.net/ondrej/php/ubuntu/ jammy main 3、匯入所需的金鑰: sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 4f4ea0aae5267a6c  然後再作 apt update 及 apt install php7.4-fpm 及 php7.4 的相關套件即可。 設定系統主要啟用 PHP 版本 sudo update-alternatives --config php

Caddy2 設定 CodeIgniter4

繼上篇安裝及設定 Caddy2 網頁伺服器,完成 http/3 服務後,接下來設定 CodeIgniter 4 的使用環境。 來基隆之後,自己習慣使用 CodeIgniter 4(CI4)來作網站開發。CI4 是蠻流行的 PHP 框架,以自已的經驗真的很好用而且快速,而且因為我的案子基本上都是設定在差不多的族群,所以在基礎的資料庫架構及部份基本功能都一樣,可以直接做成 Model 和 Controller,下一個案子直接複制過去就可以了。 Apache2 設定 以往伺服器是用 Apache2 架的,在網站的設定上只須要設定 Alias 和 Directory 即可,rewrite 的部份由 CI4 自帶的 .htaccess 完成。例如將 CI4 的網站 composer 在 /var/www/ci4 路徑中: Alias /ci4 "/var/www/ci4/public"         <Directory "/var/www/ci4/public">                 Options -Indexes                 AllowOverride All                 <Limit GET POST>                         Require all granted                 </Limit>         </Directory> 因為自已的程式還沒有開始使用 CRUD 類似 API 的作法,所以都習慣會作 Limit GET POST 去限制客戶端的 method。 Caddy2 設定 Caddy2 的設定忙...

支援 HTTP/3 網頁伺服器 Caddy v2 安裝

自已原本擅長使用的網頁伺服器是 Apache2,還在學校的時候已經能夠使用 Let's Encypt 的 SSL 憑證來達成 http 2.0 的服務。 除了 Apache 外,也嚐試使用過 Nginx 及 Lighttp 等網頁伺服器程式,相較下 Apache 穩定但花費效能較多,但是因為比較熟悉順手,來到基隆時一樣用 Apache 來架設網頁。 但在 http/3 規格確定後,許多大型網站,如:Google、Facebook等都採用 http/3 服務。http/3 採用 udp 通訊協定,理論上可以加快網頁的傳輸速度,網路上的資料說 Apache 尚未有改版支援 http/3 的消息,加上想要試著改掉古老又笨重的 apache 伺服器,找了幾個目前有支援或打算支援 http/3 的網頁伺服器。 目前找到的伺服器有:Caddy、OpenLiteSpeed、Nginx(開始改版支援中)、新版的 IIS。 Caddy:用 go 語言撰寫的網頁伺服器,可用於作代理。除了支援 http/3 外,如果有合法的網域 DNS,甚至會自動產生 Let's Encypt SSL 憑證,完全不需要經過申請。 Caddy 2 (caddyserver.com) OpenLiteSpeed:具有 cPanel的後台管理系統,但是試用了一下不太會用。 OpenLiteSpeed 目前實作是用 Caddy v2。 安裝 ( Install — Caddy Documentation (caddyserver.com) ) Caddy2 有提供各大 linux 版本套件,以自已是順手的 ubuntu 為例: sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable...

CI4 利用 gmail 發信

最近一個專案須要在預約登記成功之後,發送通知信至使用者的電子郵件信箱,所以研究了一下 CI4 中的 Email Library。 CI4 Email Class 參考網址: https://codeigniter.com/user_guide/libraries/email.html CI4 已經有內建電子郵件的服務(/Config/Services::Email()),只需要在 app/Config/Email.php 中填入必要的參數即可。其中可用的發信 protocol 可使用 mail、sendmail 和 smtp,使用 smtp 可以由 smtp.gmail.com 也就是用 Gmail 的 SMTP 來發信。 利用 Gmail SMPT 需要設定的參數: public $protocol =  'mail'; public $SMTPHost =  'smtp.gmail.com'; public $SMTPUser =  'Gmail帳號'; public $SMTPPass =  'Google 應用程式密碼'; public $SMTPPost =  465; public $SMTPCrypto = 'ssl';  //預設為 tls,一定要改成 ssl,否則發不出去。 其他參數: public $wordWrap = false; //取消自動斷行 Google 應用程式密碼 以前寫過利用 Gmail SMTP 發信的程式,用的是原有的 gmail 帳號和密碼,需要將該帳號安全性定開啟「 低安全性應用程式存取權 」: 但這樣子會降低 google 帳號的安全性,並不建議如此做!現今的方式是使用「 Google 應用程式密碼 」來處理。 參考網址:【2021最新版】如何使用Google SMTP寄信(兩段式驗證+應用程式密碼) - 主機架站寄信教學  https://www.webdesigntooler.com/google-smtp-send-mail   CI4 發信程式 取自 CodeIgniter 4 官網說明

CI4 + Google Oauth2

因自己在教育處寫的系統無法使用 SSO OpenID 的認證服務,所以改以使用 Google OAuth2.0 作 gm.kl.edu.tw 網域帳號的認證。不過,後來發現把這一部份研究清楚也很有好處,首先不會受限於一定要是 OpenID 帳號才能使用的系統,因為現實面上有很多老師和承辦還是不習慣使用 OpenID 附帶的 gm.kl.edu.tw 帳號;再後來用了 firebase 服務後,更可以擴大到更廣的 OAuth(如FB、Github…等)。  Google API 提供 OAuth2.0 的帳號認證服務,主要的功能是提供網頁系統可以認證 Google 帳號,並提供認證帳號的基本資訊。 Google Cloud 網址: https://console.cloud.google.com/ 在CI4要使用 Google OAuth2.0須先在 CI4 系統中安裝 「Google APIs Client Library for PHP」 composer require google/apiclient:^2.12.1 認證程式參考資料:Login with Google for Codeigniter  https://github.com/angel-of-death/Codeigniter-Google-OAuth-Login Google Cloud API 設定 1. 到 Google Cloud 建立專案 2. 在專案的 「API和服務」功能下建立 OAuth2.0用戶端憑證: 用戶端憑證有兩種情形:內部及外部。 「內部」表可以直接使用來認證與專案同網域的帳號,「外部」表可以用來認證任何網域的 Google 帳號,但需要經過 Google 的程式審查,我還沒試過!後來用了 firebase 後就可認證其他網域的帳號了。 在憑證的設定中,最重要的已授權的重新導向URI的部份,也就是一般的 Call Back URI,成功經過 Google 認證後會自動導向的網址,並會附帶 token,利用這個 token 就可以進一步取得使用者的基本資訊。 而同時有好幾個網站都用這一個用戶端憑證時(基本上我寫的所有網站都是用這個憑證…),要如何分辨是哪個網站來的?要回去哪邊? 就是用設定來指定 redirectURI: 我採用上述的範例程式改的,所以...

CI 4.2.0 之後新增的 Auto Routing 設定

 一直以來都是利用  compose 來創建  CI4 的網站架構,在 CI4 更新到 4.2.0 版本之後,原本 function ***() 為作路徑的方式突然不能使用了,找了一下官網的說明之後,才發現有了新的 auto-routing 的設定。 Enable Auto Routing 開啟 auto-routing 的設定:修改 app/Config/Routes.php 設定 $routes->setAutoRoute(true) Enable Auto Routing (Improved) 基本上開啟上面的 auto-routing 的設定後,CI4 的路徑就會和以前一樣用 function name 來自動路由,但官網有建立還要再開啟 auto-routing(improved) 這個設定。 修改 app/Config/Features.php 開啟 auto-routing(improved)後,function 的名稱須要再加上 http method, 例如 getIndex()、postUpdate(),function 名稱配合 http method 才能正常執行,以增加網路安全,避免惡意的嚐試。

ci4 常用套件安裝

因為已經習慣用 codeigniter4(CI4)作網站開發,有部份常用套件的安裝流程紀錄起來,以後比較容易查詢。 Google APIs Client Library for PHP 安裝:composer require google/apiclient:^2.12.1 Github網址: https://github.com/googleapis/google-api-php-client 這個主要是用於 Google Oauth2 認證使用的。 PhpSpreadsheet 安裝:composer require phpoffice/phpspreadsheet Github網址: https://github.com/PHPOffice/PhpSpreadsheet 官網文件: https://phpspreadsheet.readthedocs.io/en/latest/ 處理Excel(或其他試算表檔案格式)的php 函式庫,用於匯入、匯出資料成試算表格式檔案。 Firebase 官網:h ttps://firebase.google.com/ 安裝:composer require tatter/firebase  

Apache 、PHP 安全性設定

最近因為基隆教育網路虛擬主機上放程式,申請弱點掃描後,收到報告開始修正弱點和漏洞時,發現太久沒有碰伺服器相關的議題,安全性的設定多出來非常的多。 參考網站:http://lab.aoetek.com/index.php/2018/09/27/2018092701/ 備份參考網站,以後再有需要時可以快速找到。

利用 fail2ban 來達到自動封鎖的功能

繼前幾篇有關分析嚐試入侵紀錄的文章後,因為要一直分析和利用 whois 來抓 ip 區段,再寫到 iptables 防火牆規則去做封鎖的動作太累人了,所以利用 fail2ban 套件來達到自動封鎖的功能。 fail2ban 利用分析紀錄檔中固定的登入失敗的訊息,來抓取嚐試入侵的 ip,作法和前幾篇所講的手法是一樣的,只不過是程式來自動執行(好像是用 python 寫的,有空再來研究看看這些程式的寫法),加上設定檔指定各種封鎖相關的參數。 網路上相當多技術文章,就不特別把安裝和設定的過程寫出來了。 Ubuntu 16.04 安裝 fail2ban 如何在Ubuntu Server 18.04上安裝fail2ban How to Install and Configure Fail2ban on Ubuntu 20.04 [ Linux ] – 主機基本防護 防止爆力登入 fail2ban 簡易用法 Ubuntu 中使用 fail2ban 針對大量 access 做判斷及阻擋

入侵 IP 區段的收集(持續更新)

 前兩篇的 SSH 入侵分析,把收集到的 IP 區段提供出來給需要的人使用: 2021/02/01更新 1.53.0.0/16 1.169.0.0/16 14.98.64.0/19 14.160.0.0/11 14.224.0.0/11 31.201.0.0/16 31.220.0.0/22 36.66.176.0/20 37.59.0.0/16 37.99.248.0/21 42.112.224.0/20 45.55.0.0/16 46.101.0.0/16 49.51.0.0/16 49.232.0.0/14 51.15.0.0/17 51.77.0.0/16 51.161.0.0/16 58.187.0.0/20 60.191.0.0/16 61.90.0.0/16 61.177.0.0/16 63.168.168.0/23 64.225.0.0/17 65.49.0.0/17 65.128.0.0/11 66.186.3.0/24 67.0.0.0/13 67.207.64.0/19 67.216.192.0/19 68.183.0.0/16 68.190.192.0/18 71.208.0.0/12 72.160.0.0/15 75.160.0.0/12 76.0.0.0/13 81.68.0.0/15 81.161.63.0/24 82.50.0.0/16 84.2.0.0/15 84.128.0.0/10 87.208.0.0/13 88.88.0.0/13 91.241.19.0/24 91.192.100.0/22 101.32.0.0/16 101.80.0.0/12 101.108.0.0/15 103.21.0.0/16 103.25.0.0/16 103.45.0.0/16 103.81.0.0/16 103.84.0.0/16 103.111.0.0/16 103.217.0.0/16 103.231.0.0/16 103.248.28.0/22 106.12.0.0/15 106.52.0.0/14 106.75.0.0/16 111.93.0.0/16 111.229.0.0/16 111.230.0.0/15 112.80.0.0/13 112.160.0.0/11 113.200.0.0/15 114.134.24.0/2...

入侵紀錄分析

 上篇利用 grep 和 awk 將嚐試利用 SSH 入侵的紀錄篩選出來分析,發現有幾種入侵類型: 一、密碼字典攻擊: 利用外洩的密碼表或收集常用密碼入侵粗心大意網管架設的伺服器。 防範的方式是不允許 root 帳號利用 SSH 登入系統,現今新版的 Linux distro 都有預設。 二、帳號密碼字典攻擊: 利用英文姓名或系統固定內建帳號,搭配外洩密碼表或字典密碼進行攻擊。 防範方式是限定 SSH 登入的帳號或群組,並且設置足夠安全的密碼。 三、進階帳號字典攻擊: 此類攻擊雖然也是帳號字典攻擊,但使用的帳號不再是亂槍打鳥的方式,會針對伺服器系統來作帳號攻擊,而且從這種攻擊模式可以看出某些廠牌設備會受到攻擊關注。 上圖中的「HwHiAiUser」查詢結果是華為出品某伺服器的預設管理帳號。 此類攻擊防範也是限定 SSH 登入帳號及群組,並且設置足夠安全的密碼。 四、用到錯誤字典程式的菜鳥: 在分析入侵資料中,有發現如上圖非常奇異的帳號,看起來應該不是帳號而是密碼。表示該駭客用到的字典程式欄位設定錯誤,把密碼拿來當帳號在試。 而且不只一組IP有會種情形,從收集到的資料內發現有兩個IP以上會有這樣的情形,用 whois 查詢了一下,都是中國那邊的IP,而且不是同一個區域喔!