Makale Özeti

SFTP’nin açılımı, Secure File Transfer Protocol, yani Güvenli Dosya Aktartım Protokolü’dür. Klasik FTP den farklı olarak iki bilgisayar arasındaki dosya aktarımını SSH yöntemini kullanarak şifreli bir şekilde gerçekleştirir ve 22 nolu portu kullanır. Bu döküman, bir Windows işletiminde SFTP server kurulumu, konfigirasyonu, güvenliği ve .Net programcıları için temel SFTP işlemlerini kod bazlı nasıl yapabilecekleri konuları ele alınmaktadır. Döküman, SFTP Server kurmak isteyen sistem yöneticileri ve SFTP ile programsal işlemler yapmak isteyen programcılar için yazılmıştır. Dökümanda bulunan kod örnekleri Visual Studio 2008 ortamında .Net Framework 3.5 kullanılarak C# 3.0 ile başarılı bir şekilde test edilmiştir.

Makale

secure fıle transfer protocol

 

İçindekiler

Giriş. 1

1.      Windows için SFTP Sunucu Kurulumu. 2

1.1.       Open SSH Konfigirasyonu. 2

1.2.       İnce Ayarlar. 2

2.      Kod tabanlı SFTP istemci işlemleri 3

2.1.       Komut Desenleri 4

2.2.       Örnek Kod Parçaları 4

2.2.1.         Dizin Listeleme. 4

2.2.2.         Dosya İndirme. 5

2.2.3.         Dosya Yükleme. 5

2.2.4.         Dosya Silme. 6

 

 

Giriş

 

SFTP’nin açılımı, Secure File Transfer Protocol, yani Güvenli Dosya Aktartım Protokolü’dür. Klasik FTP den farklı olarak iki bilgisayar arasındaki dosya aktarımını SSH yöntemini kullanarak şifreli bir şekilde gerçekleştirir ve 22 nolu portu kullanır.

Bu döküman, bir Windows işletiminde SFTP server kurulumu, konfigirasyonu, güvenliği ve .Net programcıları için temel SFTP işlemlerini kod bazlı nasıl yapabilecekleri konuları ele alınmaktadır. Döküman, SFTP Server kurmak isteyen sistem yöneticileri ve SFTP ile programsal işlemler yapmak isteyen programcılar için yazılmıştır.

Dökümanda bulunan kod örnekleri Visual Studio 2008 ortamında .Net Framework 3.5 kullanılarak C# 3.0 ile başarılı bir şekilde test edilmiştir.

 


1.    Windows için SFTP Sunucu Kurulumu

 

Unix tabanlı işletim sistemlerinde genellikle SSH kurulu olur. Ancak, Windows sistemlerini SFTP server olarak kullanabilmek için sonradan kurulum yapmamız gerekmektedir. Bunun için “Open SSH for Windows” isimli özgür yazılımdan yararlanılabilir.  [1]

OpenSSH, bir Windows Service olarak çalışır. SFTP işlemini gerçekleştirecek kullanıcı hesapları için Windows’un yerel yada etki alanı kullanıcılarına ihtiyaç duyar. Bunun anlamı, standart FTP Server programlarında olduğu gibi bir FTP hesabı açmak yerine önce Windows’ta bir kullanıcı hesabı oluşturulur ve bu hesap OpenSSH ile ilişkilendirilir.

1.1.            Open SSH Konfigirasyonu

 

OpenSSH’ın web sitesinden son versiyonu indirip kurun. [2]

Önemli : OpenSSH’ın doğru çalışabilmesi için kurulumdan sonra grup ve parola dosyalarının oluşturulması gerekmektedir. Bunun için gerekli komut dosyalarının varsayılan yolu : “c:\program files\openssh\bin”.

1.       Önce bir grup dosyası oluşturulması gerekir. Bunun için;  Command Prompt’u açıp aşağıdaki komut çalıştırılır.
C:\program files\openssh\bin \mkgroup.exe -l >> ..\etc\group
Bu, İşletim sistemindeki kullanıcı gruplarıyla ilişkili bir dosya oluşturur.

 

2.       İkinci işlemimiz bir parola dosyası oluşturmak. Bunun içinde aşağıdaki komutu çalıştırmalıyız.
C:\program files\openssh\bin \mkpasswd -l -u username >> ..\etc\passwd
Bu komutta username yerine SFTP Server için kullanacağımız bir yerel kullanıcı hesabının adı yazılması gerekmektedir.

 

3.       Windows Services’tan OpenSSH isimli Windows servisi başlattığımızda Windows işletim sistemimiz bir SFTP hizmeti vermeye hazır halde olacaktır.

1.2.            İnce Ayarlar

 

Yukarıdaki yönergeleri uyguladığımızda Bir SFTP istemci programı ile SFTP protokolünü kullanarak dosya alış verişi yapabiliriz.  Ancak, SFTP işleminde kullanılan hesap bir Windows yerel kullanıcı hesabı olduğu için, varsayılan ayarlar ile oluşturulan bir kullanıcı hesabı önemli güvenlik açıkları oluşturacaktır.

Bir Windows yerel kullanıcı hesabı oluşturduğunuzda , kullanıcının ait olduğu varsayılan grup “User” grubudur, varsayılan dosya yolu ise C:\Documents and Settings\username şeklindedir. SFTP istemci programı ile bağlandığınızda da varsayılan dizin bu dizin olacaktır. Ve kullanıcı User gurubuna dahil olduğundan dizinler ve hatta sürücüler arasında gezebilecek, her işlemi gerçekleştirebilecektir.

Bunu önlemek için önce kullanıcıyı User gurubundan çıkarmalı, daha sonra kullanıcının varsayılan dosya yolunun değiştirmeliyiz. Kullanıcı bir dizine hapsetmek için ise NTFS dosya izinlerinden yararlanacağız.

Windows yerel kullanıcısı dizine hapsetmek için ise şu adımlar uygulanmalırıdır.

1.       Yerel kullanıcıyı User gurundan çıkarın : Bilgisayarım’a sağ tıklayın, Yönet komutunu verin.  Bilgisayar Yönetimi penceresinde bulunan ağaç menüden Yerel kullanıcı ve gruplar’ı açık. Kullacılar’a tıklayın. Yerel kullanıcının üzerine sağ tıklayın. Özelliklere girin. Gruplar sekmesinden User gurubunu kaldırın ve Tamam tuşuna basın.

2.       Yerel Windows kullanıcısının varsayılan dosya yolunu değiştirin : Komut satırında aşağıdaki komutu çalıştırın.
C:\> net user username /HOMEDIR:D:\test4sftp

3.       Kullanıcıyı dizine hapsedin :

a.       Tüm sürücülerde uygulanmak üzere, sürücü’ye sağ tıklayın ve özellikler’e girin. Güvenlik sekmesinde Grup yada kullanıcı adları penceresine ilgili kullanıcıyı ekleyin. İzinler kısmında Tüm haklar için Deny’i işaretleyin.

b.      SFTP işlemleri için ayrılan dizine sağ tıklayın ve özellikler’e girin. Güvenlik sekmesinde Grup yada kullanıcı adları penceresine ilgili kullanıcıyı ekleyin. İzinler kısmında Tüm haklar için Allow’u işaretleyin.

Dikkat : Bu işlemleri yaptıktan sonra, İnce Ayarlar isimli bölümdeki bahsi geçen mkgroup ve mkpasswd komutları yeniden çalıştırılmalı ve OpenSSH isimli Windows Service’i yeniden başlatılmalıdır.

Bir SFTP istemci programı ile SFTP hizmeti veren sunucumuza bağlanıp testlerinizi gerçekleştirebilirsiniz.  Bunun için FileZilla yada WinSCP gibi özgür yazılımlar kullanabilirsiniz. 22  nolu portu kullanacağınızı unutmayın !

2.    Kod tabanlı SFTP istemci işlemleri

 

Geliştirdiğiniz bir uygulamada SFTP işlemlerini yapmanız gerekiyorsa piyasada bunu yapan ücretli bileşenler bulmanız mümkün. Ancak bunu özgür yazılımlar yardımı ile de yapabilirsiniz. Doğal olarak ücretli bileşenler kadar basit ve pratik olmasada en azından temel dosya aktarım işlemlerini gerçekleştirebilirsiniz.

Bunun için PuTTY isimli bir özgür yazılım kullanacağız. PuTTY, Windows için bir telnet ve SSH istemcisidir. [3] Bu yazılım SFTP işlemlerini komut satırından verilen argümanlar ile gerçekleştirmektedir. Bu dökümanda geliştirdiğimiz çözüm için PSCP ve PSFTP isimli iki exe dosyasını kullanacağız. Bu dosyaları indirebileceğiniz adresleri dökümanın sonunda bulunan bağlantılar kısmında bulabilirsiniz.

PSCP.exe  : Dizin listeleme, dosya yükleme ve indirme işlemleri, [4]

PSFTP.exe : Dosya silme işlemi, [5]

için kullanıyor olacağız.

2.1.          Komut Desenleri

 

·         Dizin Listeleme :
pscp.exe -l username -pw password -ls username@sftp.address.com:/

·         Dosya indirme :
pscp.exe -l username -pw password username@sftp.address.com:/remoteFilePath localFilePath

·         Dosya yükleme :
pscp.exe -l username -pw password localFilePath username@sftp.address.com:/remoteFilePath

·         Dosya silme :
psftp.exe username@sftp.address.com -pw password -b batchfile.txt
bactfile.txt content : del remoteFilePath,

2.2.          Örnek Kod Parçaları

2.2.1.      Dizin Listeleme

 

string username = "testuser";

string password = "testpass";

string server = "127.0.0.1";

 

string commandFilePath = @"C:\pscp.exe";

string commandPatern = "-l {0} -pw {1} -ls {0}@{2}:/";

string commandLine = string.Format(

                                    commandPatern,

                                    username,

                                    password,

                                    server

                                    );

 

Process process = new Process();

process.StartInfo.FileName = commandFilePath;

process.StartInfo.Arguments = commandLine;

process.StartInfo.RedirectStandardOutput = true;

process.StartInfo.UseShellExecute = false;

process.Start();

string standartOutput = process.StandardOutput.ReadToEnd();

process.Close();

 

string[] lines;

lines = standartOutput.Split(

                            Environment.NewLine.ToCharArray(),

                            StringSplitOptions.RemoveEmptyEntries

                            );

StringBuilder sb = new StringBuilder();

foreach(string line in lines)

{

    if(line.Substring(0,1) == "-")

    {

        string remoteFileName = line.Substring(56);

        sb.AppendFormat("{0}\r\n",remoteFileName);

    }

}

MessageBox.Show(sb.ToString());

 

2.2.2.       Dosya İndirme

 

string username = "testuser";

string password = "testpass";

string server = "127.0.0.1";

string remoteFilePath = "test.txt";

string localFilePath = @"C:\test.txt";

 

 

string commandFilePath = @"C:\pscp.exe";

string commandPatern = "-l {0} -pw {1} {0}@{2}:/{3} {4}";

string commandLine = string.Format(

                                    commandPatern,

                                    "testuser",

                                    "testpass",

                                    "127.0.0.1",

                                    remoteFilePath,

                                    localFilePath

                                    );

 

Process process = new Process();

process.StartInfo.FileName = commandFilePath;

process.StartInfo.Arguments = commandLine;

process.StartInfo.RedirectStandardOutput = true;

process.StartInfo.UseShellExecute = false;

process.Start();

string standartOutput = process.StandardOutput.ReadToEnd();

process.Close();

 

if (standartOutput.Contains("100%") == true)

{

    MessageBox.Show("Dosya başarıyla indirildi.");

}

else

{

    MessageBox.Show("Dosya indirme işlemi başarısız.");

}

 

2.2.3.      Dosya Yükleme

 

    string username = "testuser";

    string password = "testpass";

    string server = "127.0.0.1";

    string localFilePath = @"C:\test.txt";

    string remoteFilePath = "test.txt";

 

 

    string commandFilePath = @"C:\pscp.exe";

    string commandPatern = "-l {0} -pw {1} {3} {0}@{2}:/{4}";

    string commandLine = string.Format(

                                        commandPatern,

                                        "testuser",

                                        "testpass",

                                        "127.0.0.1",

                                        localFilePath,

                                        remoteFilePath

                                        );

 

    Process process = new Process();

    process.StartInfo.FileName = commandFilePath;

    process.StartInfo.Arguments = commandLine;

    process.StartInfo.RedirectStandardOutput = true;

    process.StartInfo.UseShellExecute = false;

    process.Start();

    string standartOutput = process.StandardOutput.ReadToEnd();

    process.Close();

 

    if (standartOutput.Contains("100%") == true)

    {

        MessageBox.Show("Dosya başarıyla yüklendi.");

    }

    else

    {

        MessageBox.Show("Dosya yükleme işlemi başarısız.");

    }

2.2.4.      Dosya Silme

 

    string username = "testuser";

    string password = "testpass";

    string server = "127.0.0.1";

    string localFilePath = @"C:\test.txt";

    string remoteFilePath = "test.txt";

 

    string tempFileName = string.Format("temp_{0}", remoteFilePath);

    string tempDirectory = @"C:\temp";

    string tempFilePath = Path.Combine(tempDirectory, tempFileName);

    FileStream fs = new FileStream(tempFilePath, FileMode.Create);

    System.IO.StreamWriter sw = new StreamWriter(fs);

    sw.WriteLine(string.Format("del {0}", remoteFilePath));

    sw.Close();

    sw.Dispose();

    fs.Close();

    fs.Dispose();

 

 

    string commandFilePath = @"C:\psftp.exe";

    string commandPatern = "{0}@{1} -pw {2} -b {3}";

    string commandLine = string.Format(

                                        commandPatern,

                                        username,

                                        server,

                                        password,

                                        tempFilePath

                                        );

 

    Process process = new Process();

    process.StartInfo.FileName = commandFilePath;

    process.StartInfo.Arguments = commandLine;

    process.StartInfo.RedirectStandardOutput = true;

    process.StartInfo.UseShellExecute = false;

    process.Start();

    string standartOutput = process.StandardOutput.ReadToEnd();

    process.Close();

 

    if (standartOutput.Contains(": OK") == true)

    {

        MessageBox.Show("Dosya başarıyla silindi.");

    }

    else

    {

        MessageBox.Show("Dosya silme işlemi başarısız.");

    }

 

    System.IO.File.Delete(tempFilePath);

 

 

Referanslar

 

 [1] http://sshwindows.sourceforge.net

[2] http://sshwindows.sourceforge.net/download

[3] http://www.chiark.greenend.org.uk/~sgtatham/putty/

[3] http://the.earth.li/~sgtatham/putty/latest/x86/pscp.exe

[4] http://the.earth.li/~sgtatham/putty/latest/x86/psftp.exe

 

Kaynaklar

 

PuTTY User Manual
(http://www.interix.com/downloads/Configuring_OpenSSH.pdf)

Configuring OpenSSH for passwordless login on the Interix subsystem
( http://the.earth.li/~sgtatham/putty/0.60/htmldoc )

Setting up a SFTP Server on Windows
(http://www.digitalmediaminute.com/article/1487/setting-up-a-sftp-server-on-windows )