文件共享服務(personal-note)

應用層(通常可以跨平臺):ftp

內核(作爲內核的子系統工作的):nfs,很難跨平臺。

跨平臺samba:在linux實現cifs(smb公用信息塊) 協議,

如今網絡上有三種存儲

DAS 直接附加存儲(直接附加在主板上的存儲)

NAS 網絡附加存儲,網絡服務器提供共享存儲  nfs和samba實現的cifs協議其實就是NAS的一種實現

市面上很多NAS專業級的存儲設備無非就是優化了內核和背後支持的cifs/nfs的服務器而已

SAN 通過塊級別協議將文化存儲在遠程的共享存儲中的,與NAS不同的是,SAN是塊級別,NAS工作在應用層協議的,而SAN則是工作在內核模式下的。

對於SAN來說,拿到後得需要分區,格式化等等,的、而對於NAS則可以拿來直接使用。.0

 

FTP:文件傳輸協議,基於TCP工作,應用層協議。基於socket模式進行通信,基於應用層協議的請求和響應來實現客戶端和服務器端的交互。

 

C/S 架構

  Client:程序

Server:程序

基於socket通信,而且fto僅支持ipv4 domain和ipv6 domain方式

即使C和S都在本機,也不會基於Unix socket進行通信,服務器會監聽在

數據:

ftp有 命令連接:文件管理類命令

數據連接:以完成數據傳輸

工作模型:服務器端只監聽命令連接,在tcp的21號端口。所以當客戶端第一次訪問服務器端,套接字文件會訪問21號端口。當客戶端要上傳或下載一個數據時,我們的ftp的服務器端會啓動系統調用,向底層要這個文件,而後把這個文件分割包, 需要另外一個連接發送給客戶端。所以說命令連接和數據連接是兩個不同的連接,也可以說命令連接本身是一致建立的,直到你說bye以後(始終在線的連接),而數據連接則是按需建立及關閉的連接。

ftp也是多進程工作,而且ftp也是允許併發連接的。數據在網上傳輸有個編碼格式,比如http超文本傳輸協議傳輸的是編碼成文本格式的,如果是圖片呢?圖片是二進制格式編碼的,如何進行圖片的傳輸呢?base64!通過base64把二進制編碼成文本,到目標端,通過base64換成圖片。

而ftp呢?是哪種傳輸格式呢?

ftp即支持文本傳輸,又支持二進制傳輸。

數據連接有主動和被動兩種模式

命令連接:肯定是客戶端請求,服務器端響應建立起來的會話。

數據連接呢?:

如果我們站在服務器角度來講

主動是由服務器端創建連接

當客戶端發起一個下載數據的請求,服務器端就主動創建一個連接與客戶端進行數據傳輸。但服務器端怎麼知道客戶端在哪個端口呢?

當服務區主動連接客戶端時,會在server端的20號端口上主動連接客戶端50000+1的端口。客戶端在命令連接時就已經告訴服務器端它自己在哪個端口等着。

大多情況下,服務器的主動連接都存在弊端,那就是當服務器端主動發起數據連接時,客戶端往往有防火牆。

於是誕生被動模式:

命令連接依然有客戶端發起的,而數據連接也是由數據連接, 數據連接時,客戶端用自己的50000+1的端口連接服務器的隨機端口,而客戶端怎麼知道服務器端的隨機端口呢?其實在客戶端主動發起命令連接時,服務器端就已經告訴客戶端已開啓一個子進程來響應數據連接而把隨機端口告訴了客戶端。告知方式是121,23就是121*256+23。

服務器的防火牆可以檢查連接的相關性,叫連接追蹤的功能。

ftp是C/S架構的應用層協議

server:windows(IIS)

           wu-ftpd

           proftpd

           pureftpd

           vsftpd:Very Secure ftpd

           ServU(win)

Client(linux下):

          ftp

          lftp

          wget

          curl

          lftpget

          filezilla(開源ftp功能)

         gtp(linux的GUI)工具

         flashfxp

         cuteftp

ftp協議與http協議近似,也有響應碼

1xx:純粹是信息碼

2xx:成功

3xx:需要進一步提示補全信息

4xx:客戶端錯誤

5xx:服務端錯誤

用戶認證:

     mysql與ftp區別

mysql與ftp都是應用層協議,但背後存儲不一樣,

ftp

mysql存數據,不會直接存成塊的,會存成關係型數據庫組織的格式的

mysql提供的是結構化數據(非常方便組織數據結構,描述數據本身的組織格式),ftp提供非結構化數據。

而html是屬於半結構化的數據,可以自己貼標籤的。

ftp要實現用戶認證,如何授權?再說mysql,mysql使用的賬號與操作系統的賬號沒有半毛錢的關係,mysql的用戶賬號在mysql的user表中存放。 

虛擬用戶,此用戶賬號僅用於某特定服務中的資源。

而早期的ftp服務使用系統賬號認證用戶,ftp也支持虛擬用戶,ftp也可以把自己的賬號放到mysql中,除了ftp,很多軟件也要用到用戶認證功能,所以我們應該做成一個共享服務框架,讓大家都可以調用。

系統上兩個應用,一個是nsswitch(網絡服務轉換)實現名稱解析的框架, 而nsswitch的配置文件在/etc/nsswitch.conf

模塊在/lib64/libnss*,/usr/lib64/libnss*

另一個是pam實現用戶認證的框架。pam:插入認證模塊

pam的模塊在/lib64/security,針對64平臺

pam的配置文件在/etc/pam.d/*

pam的主配置文件/etc/pam.conf

計算機識別用戶都是根據id號識別的,而我們更容易記得是用戶名稱,很多軟件更是要依靠名稱解析,譬如說把ip地址轉換成FQDN,用戶的id號轉換成用戶名,組id號轉換成組名,進程id號轉換成進程名稱。而解析就是查找數據庫的對應關係,服務器端程序在已知庫查找對應關係。

而給我們的啓示是:軟件如果想更通用,就儘可能脫離底層平臺的功能。

 

vsftpd:

也支持系統用戶,

也支持匿名用戶,儘管說你是匿名的,到系統上運行時還是以系統上某個身份訪問。

所以說不管是虛擬用戶還是匿名用戶,只要訪問到資源上的資源要使用系統的服務進程,最終還是要使用某個系統用戶的身份進行的。

CentOS系統上ftp服務器是

Vsftpd:

yum install vsftpd

如果開防火牆,先要關閉。

CentOS6.5:vsftpd

用戶認證配置文件在:/etc/pam.d/vsftpd,如果不想在/etc/passwd中讀取文件,首先要改的就是這個配置文件。

服務腳本:/etc/rc.d/init.d/vsftpd
配置文件目錄:/etc/vsftpd/

主配置文件vsftpd.conf

其他文件主要跟用戶控制有關,默認情況下,vsftpd使用系統賬號認證用戶,只要在/etc/passwd下有密碼,就可以啓動系統上的ftp服務,但ftp是明文的,用戶認證發送過程也是明文的。

/etc/vsftpd/ftpusers
/etc/vsftpd/user_list 控制哪些用戶能登錄,哪些用戶不能登錄的。

/usr/sbin/vsftpd主應用程序

匿名用戶(被映射爲ftp用戶)的共享資源位置:/var/ftp

系統用戶通過ftp訪問的資源位置:用戶自己的家目錄

虛擬用戶:通過ftp訪問的資源位置在:給虛擬用戶指定的映射成爲的系統用戶的家目錄。

vsftpd服務開啓了,確實監聽在32號端口

[root@libin cdrom1]# service vsftpd start
Starting vsftpd for vsftpd:                                [  OK  ]
[root@libin cdrom1]# ss -tnlp | grep vsftpd
LISTEN     0      32                        *:21                       *:*      users:(("vsftpd",2799,3))

作爲實驗我們準備兩臺機子

一臺192.168.1.162是vsftpd的服務器端

一臺192.168.1.150是ftp的客戶端。

由ftp發起請求

[root@localhost cdrom]# ftp 192.168.1.162
Connected to 192.168.1.162 (192.168.1.162).
220 (vsFTPd 2.2.2)
Name (192.168.1.162:root): ftp(匿名用戶映射爲ftp用戶)
331 Please specify the password.(提示你補全密碼)
Password:
230 Login successful.(顯示連接成功)
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> (可以開始連接了!)

ftp>  pwd
257 "/"

顯示爲根!

其實上並不是根 而是/var/ftp,有意實現的根切換

對於vsftpd服務端來講,如何定義ftp工作特性?

先對vsftpd.conf做一個備份。

[root@libin cdrom1]# cd /etc/vsftpd/ 進入配置文件目錄
[root@libin vsftpd]# ls
ftpusers  user_list  vsftpd.conf  vsftpd_conf_migrate.sh

編輯vsftpd.conf

anonymous_enable=YES
#
# Uncomment this to allow local users to log in.
local_enable=YES
#
# Uncomment this to enable any form of FTP write command.
write_enable=YES
#
# Default umask for local users is 077. You may wish to change this to 022,
# if your users expect that (022 is used by most other ftpd's)
local_umask=022

對於vsftpd配置文件來講,多一個空白字符都可能讓配置不生效!注意!

匿名用戶的配置:

# Please read the vsftpd.conf.5 manual page to get a full idea of vsftpd's
# capabilities.
#
anonymous_enable=YES

是否啓用匿名用戶

#anon_upload_enable=YES默認設置匿名用戶不可以上傳

我們可以試一試,用匿名用戶身份登錄:

[root@localhost cdrom]# ftp 192.168.1.162
Connected to 192.168.1.162 (192.168.1.162).
220 (vsFTPd 2.2.2)
Name (192.168.1.162:root): ftp  
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>

然後我們試試切換目錄上傳文件

ftp> lcd /etc
Local directory now /etc

-----------------------------------------------------------

ftp> put /etc/issue
local: /etc/issue remote: /etc/issue
227 Entering Passive Mode (192,168,1,162,140,248).
550 Permission denied.顯示沒有權限!

這樣我們把服務器端匿名用戶上傳啓動起來,再看看!

然後我們重新用客戶端連接服務器端,再次切換/etc目錄,上傳文件試試?顯示:

ftp> put issue
local: issue remote: issue
227 Entering Passive Mode (192,168,1,162,223,177).
553 Could not create file.

不能創建文件?

[root@libin vsftpd]# ls -ld /var/ftp
drwxr-xr-x 3 root root 4096 Aug 16 19:01 /var/ftp

/var/ftp目錄文件屬主是root,屬組也是root,對於other來說只有讀和執行的權限沒有寫權限,意味沒有辦法在裏面創建文件的!

ftp       3222  0.0  0.2  54652  1228 ?        S    19:49   0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf

而我們是以ftp用戶身份運行,它不屬於root組,只是other,沒有w權限的!而ftp這個目錄默認不允許你修改目錄自己的權限,如果我們堅持想讓ftp這個匿名用戶上傳文件怎麼辦?

那就在/var/ftp目錄下再創建一個目錄,我們就叫它upload好了

然後setfacl

setfacl -m u:ftp:rwx /var/ftp/upload

getfacl查看下

[root@libin vsftpd]# getfacl /var/ftp/upload
getfacl: Removing leading '/' from absolute path names
# file: var/ftp/upload
# owner: root
# group: root
user::rwx
user:ftp:rwx
group::r-x
mask::rwx
other::r-x

然後在客戶端下連接服務器端,ls查看一下

drwxr-xr-x 2 0 0 4096 Mar 01 2013 pub
drwxrwxr-x 2 0 0 4096 Aug 16 11:55 upload

257 "/upload"
ftp> lcd /etc/
Local directory now /etc
227 Entering Passive Mode (192,168,1,162,142,102).
150 Ok to send data.
226 Transfer complete.
103 bytes sent in 0.0381 secs (2.70 Kbytes/sec)

傳輸文件完成

#anon_mkdir_write_enable=YES 是否可以創建目錄,默認是關閉的

如果想讓匿名用戶刪除文件或者目錄,還需要自己手動添加一個選項叫

anon_other_write_enable=YES

於是網絡用戶的共享權限遵循兩個法則,一是共享用戶權限和二文件系統權限。

系統用戶配置:

# Uncomment this to allow local users to log in.
local_enable=YES

是否允許本地用戶呢?讓我們創建一個叫bigtom的系統用戶

[root@libin ~]# useradd bigtom
[root@libin ~]# passwd bigtom
Changing password for user bigtom.
New password:
BAD PASSWORD: it is based on a dictionary word
BAD PASSWORD: is too simple
Retype new password:
passwd: all authentication tokens updated successfully.

然後切換到客戶端,看看客戶端能不能登錄?

[root@localhost cdrom]# ftp 192.168.1.162
Connected to 192.168.1.162 (192.168.1.162).
220 (vsFTPd 2.2.2)
Name (192.168.1.162:root): bigtom
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>

使用pwd看看路徑

ftp> pwd
257 "/home/bigtom"是系統用戶bigtom的家目錄啦!

而且他可以使用cd 到/etc目錄!看:

ftp> cd /etc
250 Directory successfully changed.
ftp> ls
227 Entering Passive Mode (192,168,1,162,244,7).
150 Here comes the directory listing.
drwxr-xr-x    5 0        0            4096 Jun 29 09:16 ConsoleKit
-rw-r--r--    1 0        0            4439 Oct 17  2013 DIR_COLORS

本地用戶還有一個可寫的權限

#
# Uncomment this to enable any form of FTP write command.
write_enable=YES

默認是打開的,我們用剛纔創建的系統用戶bigtom試驗一下:

[root@localhost cdrom]# ftp 192.168.1.162
Connected to 192.168.1.162 (192.168.1.162).
220 (vsFTPd 2.2.2)
Name (192.168.1.162:root): bigtom
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>

然後我們再創建一個叫15的目錄,ls查看下。

ftp>  mkdir 15
257 "/home/bigtom/15" created
ftp> ls
227 Entering Passive Mode (192,168,1,162,208,125).
150 Here comes the directory listing.
drwxr-xr-x    2 507      518          4096 Aug 16 13:01 15
226 Directory send OK.
ftp>

ftp> rmdir 15
250 Remove directory operation successful.

而且還能刪除

另外我們利用系統用戶來看看文件的權限

ftp> put 1.tar
local: 1.tar remote: 1.tar
227 Entering Passive Mode (192,168,1,162,59,149).
150 Ok to send data.

傳輸成功一個叫1.tar的文件

-rw-r--r--    1 507      518       6540594 Aug 16 13:05 1.tar

而1.tar的默認權限是644,這裏服務器端就規定了umask的具體數值了,

# Default umask for local users is 077. You may wish to change this to 022,
# if your users expect that (022 is used by most other ftpd's)
local_umask=022

假設我們改爲077試一下

-rw-------    1 507      518       5031834 Aug 16 13:09 httpd-2.4.10.tar.bz2

可見這個umask僅是定義在ftp傳輸中的權限的。

如何把本地用戶鎖定在“家目錄上”

#chroot_local_user=YES開啓了以後,就被禁錮了。

[root@localhost cdrom]# ftp 192.168.1.162
Connected to 192.168.1.162 (192.168.1.162).
220 (vsFTPd 2.2.2)
Name (192.168.1.162:root): bigtom
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/"
ftp>

開啓以後就被禁錮了~再也看不見/home/bigtom了

但是我們有時候可以給一些用戶一些特權,讓它可以在別的目錄遊蕩,於是我們可以定義下面的兩項:

#chroot_list_enable=YES
# (default follows)
#chroot_list_file=/etc/vsftpd/chroot_list

把那些特權用戶放到list中,默認的文件是/etc/vsftpd/chroot_list

,如果你沒有啓用的話,是沒有那個文件的。

[root@libin ~]# cat /etc/vsftpd/chroot_list
cat: /etc/vsftpd/chroot_list: No such file or directory

我們可以定義一個:chroot_list列表文件

然後在創建一個新的用戶,譬如說叫bigjerry,然後把bigjerry放到列表文件中,看看實際效果:是不是bigjerry被禁錮了。

[root@libin vsftpd]# vim chroot_list

[root@libin vsftpd]# cat chroot_list
bigjerry


[root@libin vsftpd]# useradd bigjerry
[root@libin vsftpd]# passwd bigjerry
Changing password for user bigjerry.
New password:
BAD PASSWORD: it is based on a dictionary word
Retype new password:
passwd: all authentication tokens updated successfully.

然後我們用客戶端連接服務端,看看實際效果

這是bigtom用戶的:

ftp> pwd
257 "/home/bigtom"

關於bigjerry

Name (192.168.1.162:root): bigjerry  
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/"

系統用戶 bigjerry就被禁錮住了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章