2019年10月16日 星期三

處理openssh相容性問題


最近把用了很多年的伺服器換掉,結果遇到一堆問題。先簡述一下:我有很多設備要管理,我們會定期用程式請這些設備吐設定檔回來。但在這一次更換server後,有部份機器吐不回來。

1、    先確認問題點。有這個問題的都是跑舊的OS的機器。
2、    我們用的是sftp,因此可以推測大概是加密方式(強度)之類的問題
3、    Log有分兩種,讓人意外的是新款的設備也無法正常連線
Oct 16 09:15:30 28.test.net.tw %SSH-3-ERROR: failed to authenticate admin enable
Oct 16 09:17:10 28.test.net.tw %SSH-3-ERROR: failed to authenticate admin !
192.168.230.56:Oct 16 09:16:23 56.test.net.tw %SSH-3-ERROR: key_verify failed for server_host_key
192.168.230.81:Oct 16 09:16:20 81.test.net.tw %SSH-3-ERROR: key_verify failed for server_host_key
192.168.230.82:Oct 16 09:16:19 81.test.net.tw %SSH-3-ERROR: key_verify failed for server_host_key
4、從log上看起來,我本來懷疑是設備的問題,還進了shell mode查了很久。看是不是能更新server_host_ke這個檔案來處理。但後來發現沒有這個檔案一樣可以正常運作,因此又回頭找伺服器的問題。
5、既然懷疑是伺服器的相容性問題。因此我作了很多調整。調cipher,調kex,調key (本來是懷疑伺服器用的加密方式太新,舊設備不支援,打算讓伺服器向下相容)
6、試了很多參數都沒有效。因此只好調整伺服器的版本,最後找了一個相對沒有那麼舊的版本將tarball解壓編譯安裝後解決了。

以下是有問題的連線,server給了New Keys之後就被斷線了。




正常應該是這樣才對,server給了新key後,clinetserver間用新key加密傳資料

作一些筆記以後用:
以下是查詢目前ssh server支援(可使用)的加密方式、驗證方式。
ssh -Q cipher
ssh -Q mac
ssh -Q kex
ssh -Q key
man 5 sshd_config這個指令也可以查看。

新版設備使用的加密方式:
cipher=aes128-ctr ksize=128 mac=hmac-sha1 pfs=diffie-hellman-group-exchange-sha256

舊版設備使用的加密方式:
cipher=3des-cbc ksize=192 mac=hmac-sha1 pfs=diffie-hellman-group1-sha1

不過我比對之後,openssh-server其實都有支援,因此在wireshark看起來也都能正常運作,只是不曉得為何給了新key後就斷了。

LogLevelINFO等級調整成VERBOSE  比較好查修   
LogLevel VERBOSE            

 cat /var/log/audit/audit.log | grep 192.168.18.12

你可以在sshd_config,告訴它說你只想使用哪些加密方式,可以指定CiphersMACs這些。至於HostKeyAlgorithmsKexAlgorithms我測試在新版(OpenSSH 8.x是不支援的)


另外,你在測試的時候可以用ssh -vv來查看在交握過程中出了什麼問題 (我的設備太舊不支援這個參數)

在domain中的電腦如何開啟Linux的Samba的網路芳鄰檔案共享服務

這個問題是老問題了,之前遇過一次。但沒有解決,這一次因為是換機器,避不開這個問題。只好想辦法解決。

我們先假設smb.conf的內容都是對的。這樣變數比較小,不過實際上,我們都是改改調調,也不能100%的相信它沒有問題,即使testparm跟你說他是好的我們總是會懷疑。但我們還是先相信它是對的吧。

我用的Samba是4.9.1-6.el7的版本。

第一個問題是,在domain中的電腦在登入linux的samba server時,會很貼心的幫你貼上 \domain\username的帳號。這樣當然是過不了的。
我之前有錄過封包,它真的會自動幫你補上domain名稱。

解決方法很簡單,帳號改成 .\username就好了。這樣的話。它就會用\pcname\username的方法登入。但我實測的結果還是不能登入。

第二個問題是,你的密碼是用什麼指令建立的,你建立的密碼真的有被讀進來嗎?之前都是用smbpasswd,有人說現在應該要用pdbedit了,但我實測的結果,如果你沒有去動smb.conf的話,它都是產生在passdb.tdb中(當然,所存在的目錄會依你使用的linux不同而有所差異)。

第三個問題是,你的電腦乾淨嗎?以我的例子而言,因為換了機器,但是IP沒有變,還是192.168.1.2。之前儲存的\\192.168.1.2自然是不能用了。

要清除連線記錄(快取)的話,方法有很多。
klist purge
control keymgr.dll
rundll32.exe keymgr.dll, KRShowKeyMgr
基本上我都會試一下,不過我覺得比較有用的是第三個。

第四個問題,還是沒有效。怎麼辦?

這個就真的很直得討論了,我找了很久,發現以下的方法是有效的。如果你還是不能解決,就試試吧。然後可以調整一下內容裡的東西試試。

以下是操作方式:
在執行輸入secpol.msc
接著左邊選單選『本機原則』,再選『安全性選項。』
然後在右邊找到『網路安全性:LAN Manager 驗證等級』
對他點兩行,開啟內容。然後改成『只傳送NTLM v2 回應』

以下是可能的選項:
  • 傳送 LM & NTLM 回應
  • 傳送 LM & NTLM-如果交涉使用 NTLMv2 工作階段安全性 (這個是我的預設值)
  • 將 NTLM 回應只傳送
  • 傳送只 NTLMv2 回應
  • 只傳送 NTLMv2 回應。 拒絕 LM
  • 只傳送 NTLMv2 回應。 拒絕 LM & NTLM
  • 未定義
(這個是微軟機翻的版本),英文的部份是

Possible values

  • Send LM & NTLM responses
  • Send LM & NTLM - use NTLMv2 session security if negotiated
  • Send NTLM responses only
  • Send NTLMv2 responses only
  • Send NTLMv2 responses only. Refuse LM
  • Send NTLMv2 responses only. Refuse LM & NTLM
  • Not Defined


以上報告完畢。希望之後不會再花這麼多的時間作測試。

後記,由於同事需要上內部公文系統,如果修改成為NTLM V2 only會不能執行,因此我查詢了smb.conf的說明後,新增以下設定:

ntlm auth = true
讓它支援NTLM V1,降低了一點安全性。

所以結論就是,Samba 4.x為了安全性,強制用戶一定要用NTLM V2。我們可以透過修改設定檔的方法增加其相容性。



2019年8月11日 星期日

CentOS 移植心得 (Apache & PHP版本問題)

原主機是 apache 2.2+ PHP 5.4.17是用rpm裝的。新的主機是CentOS 6,懶得重裝成 CentOS 7。就打算把PHP升版,順便把apache升成2.4版。本來打算讓YUM搞定所有事,但不太順利,最後還是手動編譯tarball搞定了。

PHP要升版很容易,透過remi來升就好了。網路上教學很多。
但我升完用yum搜尋會有兩種檔案,一種是php56開頭的,另一種是php開頭後面是56的。看了一下檔案大小確實有差異,我也懶得去認真研究其差異(猜想後來yum預設的PHP也變成5.6了)。我一開始兩種都有保留,希望php56的可以直接讓apache2.4用(因為它會產出libphp5.so這個檔案)。但弄到最後沒有辦法解決問題,最後還是把php56開頭的都移除了。

接著要處理apache 2.4的問題,rhel可以升,但升完之後不支援PHP。而且路徑名稱我很不喜歡,我也不想用link的方式來解,這個網路上也有一些教學。安裝完成後我試著裝了php56開頭的檔案 但怎麼弄都是以下錯誤:
httpd: Syntax error on line 163 of httpd.conf: Cannot load modules/libphp5.so into server: modules/libphp5.so: undefined symbol: unixd_config

這個是因為apache 2.4之後function name有變的關係。

試了幾天,看來這個方法不行 於是我自己下載了php5來編譯,但結果相同。鼻子摸一摸,連apache 24也自己編譯。(最後發現也許是我在httpd.conf沒有先disable php5 module的關係,但發現時已經太晚了)

我先把apache 2.2及php 56開頭的rpm都移除。(但我沒有移除掉php開頭的檔案),我的計畫是php 56編譯後只用它產出的SO檔給apache用。其它CLI的不動。

接著下載apahce 2.4編譯 (要先編譯安裝apr及apr-util),原先aprapr及apr-util的版本太舊,因此我有將之移除,並以預設值編譯安裝。

apache 2.4的編譯指令如下供參考:
./configure --prefix=/etc/httpd --enable-so --enable-ssl --enable-cgi \
--enable-rewrite --with-zlib --with-pcre \
--with-includedapr=/usr/local/apr/include/apr-1  \
--enable-modules=most --enable-mpms-shared=all --with-mpm=prefork


安裝後再回頭下載php 5.6.40,解壓編譯它,mysql的部份是後來重編的,因為啟用PHP之後發現PHP 不認識它們家三兄弟......

./configure --with-apxs2=/etc/httpd/bin/apxs \
--with-mysql --with-pdo-mysql --with-mysqli  --with-libxml-dir --with-gd \
--with-jpeg-dir --with-png-dir --with-freetype-dir --with-iconv-dir \
--with-zlib-dir --with-bz2 --with-openssl --with-mcrypt --enable-soap \
--enable-gd-native-ttf --enable-mbstring --enable-sockets --enable-exif

重點就是mysqli還有apxs的那一段,你其實也可以在編譯apache2的時讓它用unixd_config,但你都要用新的版本了,何苦再讓它支援舊指令。

完成後把so檔丟到apache的modules目標中。
cp /usr/src/php-5.6.40/libs/libphp5.so /etc/httpd/modules/

再編輯httpd.conf
加入以下兩行:
LoadModule php5_module modules/libphp5.so
IncludeOptional conf.d/*.conf

接著在conf.d目錄中,新增php.confA
 其內容是:

   
        Require all denied
   
   
        Order allow,deny
        Deny from all
        Satisfy All
   

AddType text/html .php
DirectoryIndex index.php

   
        SetHandler application/x-httpd-php
   
    php_value session.save_handler "files"
    php_value session.save_path    "/var/lib/php/session"
    php_value soap.wsdl_cache_dir  "/var/lib/php/wsdlcache"



最後再重啟apahe就好了。


x
x

CentOS 移植心得 (SAML & PHP版本問題)

這邊快乾死了,來澆點水。

最近在做幾件事,第一件是把 Ubuntu 14.04上同事開發的系統移植到CentOS 7上。

一開始在SAML(SSO)卡了很久。實在沒有辦法去認真研究了一下它的架構,最後發現在
/var/simplesamlphp/metadata
裡面的
saml20-sp-remote.php
要新增以下內容
$metadata['http://10.100.32.31/sso/module.php/saml/sp/metadata.php/default-sp'] = array (
  'AssertionConsumerService' => 'http://10.100.32.31/sso/module.php/saml/sp/saml2-acs.php/default-sp',
  'SingleLogoutService' => 'http://10.100.32.31/sso/module.php/saml/sp/saml2-logout.php/default-sp',

);

我原以為這樣就解決了。但系統移過去就是沒有畫面。在log檔沒有任何一個字的錯誤訊息,就這樣抓了三週。幾乎把所有我想過的方法都試過了。

後來有一天早上我福至心靈,把副程式的log都開起來(本來只有開主程式,沒有想到副程式裡的log都被關掉)才發現是empty這個函數在不同的PHP版本有不同的處理方式。

Prior to PHP 5.5, empty() only supports variables; anything else will result in a parse error. In other words, the following will not work: empty(trim($name)). Instead, use trim($name) == false.

我的舊主機是PHP 5.5.9,新的主機是5.4。所以才會遇到這個問題。

最後把PHP升版後終於解決了。

2019年5月8日 星期三

FreeBSD syslog只存檔不吐log至其它server的解法

syslog.conf的內容長這樣:
local0.*                                        /var/log/firewall/ipf.log
local0.*                                        @66.66.66.69

理論上應該會丟syslog到66.66.66.69。
但就是不會吐。

找了很久,發現在rc.local中,ipmon的設定如下。看起來沒有什麼問題。但就是不丟syslog到其它server。
/sbin/ipmon -D /var/log/firewall/ipf.log

後來發現要改成這樣:
/sbin/ipmon -D -s

-s代表syslog優先於存檔

cacti 破圖的處理方式及Get Script Server Data及Get Script Data的差異

運氣很不好,cacti用別人寫的Cisco ASR的CPU及記憶體 template突然破圖。

先做基本查錯。
在log看到以下訊息:
ERROR: Input Expected, Script Server Terminating
PHP Script Server communications lost.  Restarting PHP Script Server

查了網路上的教學,一般是建議手動執行script_server.php來除錯。但我一執行就有錯誤訊息:(在另一台主機就沒有)
php -q script_server.php
PHP Script Server has Started - Parent is cmd
ERROR: Input Expected, Script Server Terminating

網路上有人教更進一步的除錯,終於有了比較明顯的訊息。感覺是主機的問題,造成parser時好時壞。(這主機很多人在裝套件我自己也更新過PHP之類的),不曉得是哪一個環節出了問題。
php -q poller.php --force --debug
/usr/share/cacti/site/scripts/ss_cisco-cpm.php: line 1: ?php
:
/usr/share/cacti/site/scripts/ss_cisco-cpm.php: line 2: /bin:
/usr/share/cacti/site/scripts/ss_cisco-cpm.php: line 3: syntax error near unexpected token `$_SERVER["argv"][0]'
/usr/share/cacti/site/scripts/ss_cisco-cpm.php: line 3: `if (!isset($_SERVER["argv"][0]) || isset($_SERVER['REQUEST_METHOD'])  || isset($_SERVER['REMOTE_ADDR'])) {
'
此題暫時無解,就再觀望一下吧目前是用另一台librenms先頂著用。

順便比較一下Get Script Server Data與Get Script Data的差異:


Get Script Server Data(Indexed):
在執行的時候需要指定function (ss_ciscocpm),因此只能在script_server.php的環境下除錯 (但在我的狀況下由於一執行script_server就當掉,因此無法除錯)
SERVER: /usr/share/cacti/site/scripts/ss_cisco-cpm.php ss_ciscocpm mydevice 55 2:161:5000:1:10:public:::::: get 1min 2082, output: 2


Get Script Data(Indexed):
不用指定function,因此也可以直接在cli下除錯。
SCRIPT: /usr/share/cacti/site/scripts/ss_cisco-cpm.php mydevice 55 2:161:5000:1:10:public:::::: get 1min 2082, output: U

例如:
php -q /usr/share/cacti/site/scripts/ss_cisco-cpm.php mydevice 4 2:161:5000:1:10:public:::::: get 1min 82

2019年4月30日 星期二

CSV檔補上BOM (exec PHP under apache)

開發程式時遇到一個問題。
就是CSV檔如果用EXCEL開中文的部份就會變亂碼,即使我檔案裡面明明是UTF8也一樣。

查了一下,就是要在檔案加上BOM,讓EXCEL知道檔案的編碼是UTF8

網路上可以查到很方便的解法,它是在CLI下運作的:

sed -i '1s/^\(\xef\xbb\xbf\)\?/\xef\xbb\xbf/' $input_ip.csv
如果前面有加了就不要再加 如果沒有加就加

sed -i '1s/^/\xef\xbb\xbf/' test.csv
不管怎麼樣都要加。

以上這兩個都是好方法,我測試時不管是丟在PHP程式裡再用exec來執行或在CLI手動執行時都正常。但放在網頁執行就有問題。大概又是那些要加反斜線 (\)之類的問題。但試了一下都沒有解決。於是我去找其它不需要加反斜線的解法,就像下面這行:

exec("printf '\xEF\xBB\xBF' | cat - tmp.csv > policies-out.csv");
在網頁環境執行PHP一樣可以跑。  

2019年4月17日 星期三

can't convert string from 'utf-8' to native encoding 的解決方式(SVN crontab not work)

跑了很久的svn,突然不能在crontab裡作業。但手動執行卻又是好的。


svn執行時又沒有log可以看。


試了半天才想到,在crontab -e可以加mailto,讓它寄mail給我看。



執行時有這個訊息:

can't convert string from 'utf-8' to native encoding


知道問題就比較好解決,在shell script裡加上這一行就好了:

export LC_CTYPE=en_US.UTF-8

Could not find/open font (PHP GD不出圖的處理方式)

有一個老程式在搬家之後突然不work了,看了一下可以出圖但不能出字。

本來以為是新的代管主機不能上網抓google cvs的關係。但看了一下並不是。

由於代管主機不能ssh查修。先把系統移回自己的主機試一下。

在查修的時候需要開log。
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
把所有log都打開。


接著執行程式就看到以下的訊息

PHP Warning:  imagettfbbox(): Could not find/open font in /home/klting/MakeGif.php on line 250
PHP Warning:  imagettftext(): Could not find/open font in /home/klting/MakeGif.php on line 165


拿這個訊息去餵狗 ,大概知道是GD對於目錄定義的問題(我猜想是為了安全性)。

只要在呼叫imagettfbbox或imagettftext之前

先做以下設定:

putenv('GDFONTPATH=' . realpath('.'));

讓GD知道要去哪邊找字型檔就好了。


但我會建議以下做法,原因很簡單,通常代管主機的路徑很複雜。所以讓GD知道實體目錄在哪比較方便。

事實上我用上面的做法是失敗的。但用我的作法就成功了。(為了驗證這個我還多花了30分鐘)

$PATH = dirname(__FILE__);

putenv('GDFONTPATH=' . realpath($PATH));

2019年3月18日 星期一

fortigate 的rsh規則開立 已有session helper是否需要開迴向規則測試

其實這個東西一聽就知道不用開迴向規則,因為FTP都不用了。不過還是測試一下,以下是RSH的測試情形:

rsh:很典型的運作,我並沒有開立迴向規則,但rsh client還是可以執行指令
在此可以看出rsh的port使用的是比較低的port (1022)
KS080-FW-FG100A-~ # diagnose sniffer packet internal 'host 59.105.191.159 and host 10.100.32.37'
interfaces=[internal]
filters=[host 59.105.191.159 and host 10.100.32.37]
17.383345 59.105.191.159.1023 -> 10.100.32.37.514: syn 124813949
17.383546 10.100.32.37.514 -> 59.105.191.159.1023: syn 3328922962 ack 124813950
17.384945 59.105.191.159.1023 -> 10.100.32.37.514: ack 3328922963
17.385015 59.105.191.159.1023 -> 10.100.32.37.514: psh 124813950 ack 3328922963
17.385180 10.100.32.37.514 -> 59.105.191.159.1023: ack 124813955
17.386397 10.100.32.37.1022 -> 59.105.191.159.1022: syn 2828457835
17.387884 59.105.191.159.1022 -> 10.100.32.37.1022: syn 313646095 ack 2828457836
17.388055 10.100.32.37.1022 -> 59.105.191.159.1022: ack 313646096
17.389497 59.105.191.159.1023 -> 10.100.32.37.514: psh 124813955 ack 3328922963
17.389670 10.100.32.37.514 -> 59.105.191.159.1023: ack 124813972
17.392663 10.100.32.37.514 -> 59.105.191.159.1023: psh 3328922963 ack 124813972
17.394048 59.105.191.159.1023 -> 10.100.32.37.514: ack 3328922964
17.394721 10.100.32.37.514 -> 59.105.191.159.1023: 3328922964 ack 124813972
17.394845 10.100.32.37.514 -> 59.105.191.159.1023: 3328924412 ack 124813972
17.394952 10.100.32.37.514 -> 59.105.191.159.1023: psh 3328925860 ack 124813972
17.395035 10.100.32.37.514 -> 59.105.191.159.1023: psh fin 3328927060 ack 124813972
17.395068 10.100.32.37.1022 -> 59.105.191.159.1022: fin 2828457836 ack 313646096
17.396794 59.105.191.159.1023 -> 10.100.32.37.514: ack 3328924412
17.397112 59.105.191.159.1023 -> 10.100.32.37.514: ack 3328925860
17.397317 59.105.191.159.1023 -> 10.100.32.37.514: ack 3328927060
17.397369 59.105.191.159.1022 -> 10.100.32.37.1022: ack 2828457837
17.398629 59.105.191.159.1022 -> 10.100.32.37.1022: fin 313646096 ack 2828457837
17.398680 59.105.191.159.1023 -> 10.100.32.37.514: fin 124813972 ack 3328927067
17.398802 10.100.32.37.1022 -> 59.105.191.159.1022: ack 313646097
17.398839 10.100.32.37.514 -> 59.105.191.159.1023: ack 124813973

以下是REXEC的測試情形,同樣沒有開立迴向規則,但還是會通。
Port位高很多。
KS080-FW-FG100A-~ # diagnose sniffer packet internal 'host 59.105.191.159 and host 10.100.32.37'
interfaces=[internal]
filters=[host 59.105.191.159 and host 10.100.32.37]
6.071296 59.105.191.159.59432 -> 10.100.32.37.512: syn 1770357772
6.071556 10.100.32.37.512 -> 59.105.191.159.59432: syn 1011819499 ack 1770357773
6.073041 59.105.191.159.59432 -> 10.100.32.37.512: ack 1011819500
6.073099 59.105.191.159.59432 -> 10.100.32.37.512: psh 1770357773 ack 1011819500
6.073226 10.100.32.37.512 -> 59.105.191.159.59432: ack 1770357779
6.074641 10.100.32.37.47809 -> 59.105.191.159.58852: syn 1063549796
6.076164 59.105.191.159.58852 -> 10.100.32.37.47809: syn 1201608936 ack 1063549797
6.076351 10.100.32.37.47809 -> 59.105.191.159.58852: ack 1201608937
6.077699 59.105.191.159.59432 -> 10.100.32.37.512: psh 1770357779 ack 1011819500
6.077874 10.100.32.37.512 -> 59.105.191.159.59432: ack 1770357799
6.084569 10.100.32.37.512 -> 59.105.191.159.59432: psh 1011819500 ack 1770357799
6.085916 59.105.191.159.59432 -> 10.100.32.37.512: ack 1011819501
6.086326 10.100.32.37.512 -> 59.105.191.159.59432: 1011819501 ack 1770357799
6.086450 10.100.32.37.512 -> 59.105.191.159.59432: 1011820949 ack 1770357799
6.086575 10.100.32.37.512 -> 59.105.191.159.59432: psh 1011822397 ack 1770357799
6.086620 10.100.32.37.47809 -> 59.105.191.159.58852: fin 1063549797 ack 1201608937
6.086655 10.100.32.37.512 -> 59.105.191.159.59432: psh fin 1011823597 ack 1770357799
6.088397 59.105.191.159.59432 -> 10.100.32.37.512: ack 1011820949
6.088708 59.105.191.159.59432 -> 10.100.32.37.512: ack 1011822397
6.088858 59.105.191.159.59432 -> 10.100.32.37.512: ack 1011823597
6.090055 59.105.191.159.58852 -> 10.100.32.37.47809: fin 1201608937 ack 1063549798
6.090114 59.105.191.159.59432 -> 10.100.32.37.512: fin 1770357799 ack 1011823604
6.090242 10.100.32.37.47809 -> 59.105.191.159.58852: ack 1201608938
6.090279 10.100.32.37.512 -> 59.105.191.159.59432: ack 1770357800


順便看一下rcp,並未看到開其它的Port,所以更單純。
klting@ubuntu:~$ vi rcp
827.296534 59.105.191.159.1023 -> 10.100.32.37.514: syn 4192287855
827.296709 10.100.32.37.514 -> 59.105.191.159.1023: syn 2950407792 ack 4192287856
827.298139 59.105.191.159.1023 -> 10.100.32.37.514: ack 2950407793
827.298192 59.105.191.159.1023 -> 10.100.32.37.514: psh 4192287856 ack 2950407793
827.298313 10.100.32.37.514 -> 59.105.191.159.1023: ack 4192287857
827.299695 59.105.191.159.1023 -> 10.100.32.37.514: psh 4192287857 ack 2950407793
827.299871 10.100.32.37.514 -> 59.105.191.159.1023: ack 4192287889
827.302149 10.100.32.37.514 -> 59.105.191.159.1023: psh 2950407793 ack 4192287889
827.302412 10.100.32.37.514 -> 59.105.191.159.1023: fin 2950407794 ack 4192287889
827.303561 59.105.191.159.1023 -> 10.100.32.37.514: ack 2950407794
827.303620 59.105.191.159.1023 -> 10.100.32.37.514: psh 4192287889 ack 2950407794
827.303782 10.100.32.37.514 -> 59.105.191.159.1023: rst 2950407794
827.303875 59.105.191.159.1023 -> 10.100.32.37.514: fin 4192287890 ack 2950407795
827.304030 10.100.32.37.514 -> 59.105.191.159.1023: rst 2950407795