部落格建置過程2 - Linux虛擬主機的初始設定

2018-08-09

虛擬主機開好了,好興奮呀


photo from ETToday新聞雲

但...要怎麼操作它??

登入Digital Ocean的控制後台,左邊選droplets,就會來到這個頁面,
如果您已經開好一台虛擬主機,畫面上應該會有類似像下面圖片上的結果,
其中紅色方塊的地方就是能夠連到您那台主機的IP,
為了安全,千萬不要讓別人知道您主機的IP。
dg_dash_board

使用終端機的ssh指令來連線我們的主機

如果您的電腦的作業系統是windows,可以用類似PieTTY, PuTTY之類的軟體來做ssh連線,
或是您可以裝git for windows,安裝好之後就有git bash可以使用, 就可以像MAC OS X一樣直接在terminal裡下一些bash指令,包含ssh,scp...這些之後我們都會用到的指令, windows的朋友也可以順便裝conEMU這個神器,它可以同時讓您開很多個 windows的terminal視窗。

底下的指令都會以在MAC OS X上執行的樣子去寫

打開終端機

在本地端電腦的terminal上輸入

ssh root@您的遠端主機的IP

因為這一次是第一次連線,系統會問您是否是否要把這個陌生的ip加入到您電腦裡已知的host中,輸入yes
接著它會問您這台虛擬主機上root的密碼,這個密碼digital ocean會寄到您註冊時使用的信箱裡,
輸入完後,因為這是第一次連線進來,系統會要求您一定要修改root的密碼,

先輸入一次目前的密碼(就是e-mail附上的那個),
再輸入更改後的密碼,
再輸入一次這個更改後的密碼,以確認密碼。

都沒錯的話,就會正式進入到server裡,,terminal上會看到

root@您的主機名稱:~#

然後游標在一閃一閃,這樣就是可以輸入指令的狀態了。

可以再開一個 terminal tab,然後一樣用root 做ssh登入,輸入新密碼,來確認剛剛密碼是否都修改正確,確認一切OK。

做好一些讓主機可以安全一點的設定

因為root是每台Linux主機上都一定會有的特殊帳號,要是有人知道您主機的IP,他一樣可以ssh到您的主機,然後用root帳號登入,接著不斷嘗試密碼,直到正確為止,所以為了安全起見,通常都必須要設定不允許使用root登入

先創個之後平常操作主機時使用的user

就先暫且叫它vip好了,以下的指令裡的vip都可以換成是任何您自己取的user名稱

 adduser vip

設定密碼。

 passwd vip

輸入一個強力一點的密碼,然後再輸入一次以確認密碼。

把這個user設定成是可以執行超級使用者才能執行的命令

超級使用者就是像root這樣特殊的使用者,現在我們要把vip變成一樣可以執行root可以執行的命令, 只是執行時,指令前面必須加上sudo並且要輸入vip的密碼,才能執行。

我們要把vip加入wheel這個特殊的群組裡,讓它可以取到root那樣等級的權限。

gpasswd -a vip wheel

wheel是一個unix-like系統裡固定存在的特殊群組,關於更多關於wheel群組的資訊或許可看:link

產生一組 公鑰+私鑰 以做驗證登入

再來我們要讓剛剛加入wheel群組的user vip,在之後可以透過一個SSH key pair驗證的機制來登入:我們在自己平常用來開發程式, 寫網誌的電腦上算出一長串的隨機文數字作為一個鑰匙,並且做成一個檔案,然後把這個檔案的內容貼在這台虛擬主機上的某個地方,之後每次vip要登入時,這個鑰匙檔案就會啟動,跟虛擬主機上的鑰匙配對,這樣就能做到只有這個檔案有存在的電腦上才能透過vip這個帳號來登入這台主機,就算vip的登入密碼不幸讓駭客知道(或是被用暴力破解法試出來,而且他還要知道您這台server上有一個可以用來登入的帳號叫vip ),駭客也無法登入這台主機,因為他的電腦上並不存在那個作為鑰匙的檔案,這會讓主機更加安全。

  • 產生一個SSH key pair 如果之前已經產生過這個東西了,就可以跳過這一步。
    下面的指令都是在我們用來連線遠端主機的那台本地電腦上執行

    localUser$ ssh-keygen

    假如您的本地端使用者帳號叫localUser,您會在terminal上看到下面這樣的文字

     Generating public/private rsa key pair.
     Enter file in which to save the key (/Users/localuser/.ssh/id_rsa):

    這邊是在問您要將這把私鑰放在哪個位置,並且它的檔名會叫id_rsa
    您可以在這裡改變它的存放位置跟檔名。
    (但底下的說明都會先假設您接受預設設定。)

    再按下enter後 在這裡您可以為這支鑰匙輸入一個通關密語(passphrase),日後您在ssh遠端主機的時候,您的電腦上除了要有id_rsa這個私鑰以外,您還必須要輸入這個通關密語,再多加一道安全性。或是也可以在這邊直接按下enter,不輸入通關密語,之後ssh遠端主機時只要電腦裡有那組鑰匙即可。

    結束上面的程序之後會在/Users/localuser/.ssh/這個資料夾底下產生兩個檔案,

    • id_rsa 這是私鑰 裡面的內容絕對不可以讓不該能夠進入您的server的人知道
    • id_rsa.pub 這是公鑰
      這兩個檔案是一對的,即是SSH key pair。

把公鑰放到遠端主機上

使用以下指令,就可以把剛剛產生出來的公鑰id_rsa.pub裡的內容印在terminal上

localUser$ cat ~/.ssh/id_rsa.pub

把跑出來的內容全部複製起來。

  • 把這個公鑰綁定在user vip 身上。
    接著,在遠端主機上,確認現在身份還是root,然後輸入以下指令可以讓我們切換使用者為我們自己創出來的vip

     su - vip

    同時這會讓我們切換到vip的home directory底下,也就是說執行

    pwd

    會看到

    /home/vip
  • 在這個資料夾底下創建一個叫.ssh的隱藏資料夾,並修改它的存取權限為只有vip自己才能存取+執行

    mkdir .ssh
    chmod 700 .ssh

    接著在.shh創出一個叫authorized_keys的檔案,在這裡我們用vi開啟它

    vi .ssh/authorized_keys

    按下i以進入 插入模式,然後貼上剛剛複製存在剪貼簿裡的那一串公鑰,
    再按下ESC以離開 插入模式,
    輸入:x(代表存檔並離開 效果等同:wq) 按下ENTER

    再把authorized_keys這個檔案的權限改成只可存取但不可執行

    chmod 600 .ssh/authorized_keys
  • 輸入以下指令,讓我們把登入的帳號從vip 切換回root

    exit

把遠端主機上的SSH daemon 設定為不允許用root登入

打開系統上sshd_config這個設定檔

vi /etc/ssh/sshd_config

這個設定檔裡有很多設定,我們的目的是要找到這行:

#PermitRootLogin yes

我們可以在 vi的非插入模式(按下ESC)下輸入/PermitRootLogin按下ENTER, vi就會找到那行,並且把游標停在P上, 按下鍵盤上的i進入插入模式,把那行的#刪除掉,以移除註解,並且把 yes 改成 no

所以這行就會變成這樣:

PermitRootLogin no

按下ESC離開插入模式,然後輸入:x按下ENTER以存檔並離開。

reload SSH

現在因為我們改變了SSH daemon的設定,所以我們應該重啟sshd service

systemctl reload sshd

這樣子就能把這台虛擬主機設定成不允許使用root登入。極度推薦每台server都應該這樣做的,以確保您的主機的安全。

登出root前,先確定那個創出來的超級使用者能使用的功能一切正常

  • 現在您應該可以使用SSH key pair做驗證然後用vip來做SSH登入了,打開一個新的terminal tab 執行
    ssh  vip@您的遠端主機的IP
    這次用vip登入時,terminal上問您的就會是id_rsa這組SSH key pair的通關密語,而不是vip的密碼
  • vip登入時,記得要執行原本root權限的指令時要在指令前面加上sudo
sudo 要執行的指令

什麼是root權限的指令? 非常的多,例如追蹤觀看系統log

tail -f ./var/log/messages

如果身份不是root的話,就會說這是不符權限的操作, 必須在指令前面加上sudo,按下ENTER後,系統會要求您要輸入vip的密碼,才能執行。

sudo tail -f ./var/log/messages

按下ctrl+c 就可以離開tail這個程式

如果都沒問題了

輸入

exit

就可以結束目前ssh連線

到這邊就算完成一些新開起來的虛擬主機該做的一些設定了。

more reference

difgital ocean - how to connect with ssh
difgital ocean - centos7 init setup
^^這篇教學大部分是看過這篇文章後的記錄,如果想看更詳細的步驟的朋友,可以參考這篇

-- end of file--

response