Thứ Hai, 22 tháng 10, 2012

Aliases problem

If an attacker can trick root or even another user into running a command, they will
be able to gain access to data or privileges they shouldn’t have. One way to trick
another user into running a malicious program is to create an alias to some other
common program (e.g., ls).
The leading \, which suppresses alias expansion, is very important because without
it you can do evil things like this:
$ alias unalias=echo
$ alias builtin=ls
$ builtin unalias vi
ls: unalias: No such file or directory
ls: vi: No such file or directory
$ unalias -a
-a

Chủ Nhật, 21 tháng 10, 2012

Awk

Awk Introduction Tutorial – 7 Awk Print Examples

by Sasikala on January 6, 2010
Linux Awk Tutorial - Introduction and Awk Examples
This is the first article on the new awk tutorial series. We’ll be posting several articles on awk in the upcoming weeks that will cover all features of awk with practical examples.
In this article, let us review the fundamental awk working methodology along with 7 practical awk print examples.

Note: Make sure you review our earlier Sed Tutorial Series.

Awk Introduction and Printing Operations

Awk is a programming language which allows easy manipulation of structured data and the generation of formatted reports. Awk stands for the names of its authors “Aho, Weinberger, and Kernighan”
The Awk is mostly used for pattern scanning and processing. It searches one or more files to see if they contain lines that matches with the specified patterns and then perform associated actions.
Some of the key features of Awk are:
  • Awk views a text file as records and fields.
  • Like common programming language, Awk has variables, conditionals and loops
  • Awk has arithmetic and string operators.
  • Awk can generate formatted reports
Awk reads from a file or from its standard input, and outputs to its standard output. Awk does not get along with non-text files.
Syntax:

awk '/search pattern1/ {Actions}
     /search pattern2/ {Actions}' file
In the above awk syntax:
  • search pattern is a regular expression.
  • Actions – statement(s) to be performed.
  • several patterns and actions are possible in Awk.
  • file – Input file.
  • Single quotes around program is to avoid shell not to interpret any of its special characters.

Awk Working Methodology

  1. Awk reads the input files one line at a time.
  2. For each line, it matches with given pattern in the given order, if matches performs the corresponding action.
  3. If no pattern matches, no action will be performed.
  4. In the above syntax, either search pattern or action are optional, But not both.
  5. If the search pattern is not given, then Awk performs the given actions for each line of the input.
  6. If the action is not given, print all that lines that matches with the given patterns which is the default action.
  7. Empty braces with out any action does nothing. It wont perform default printing operation.
  8. Each statement in Actions should be delimited by semicolon.
Let us create employee.txt file which has the following content, which will be used in the
examples mentioned below.
$cat employee.txt
100  Thomas  Manager    Sales       $5,000
200  Jason   Developer  Technology  $5,500
300  Sanjay  Sysadmin   Technology  $7,000
400  Nisha   Manager    Marketing   $9,500
500  Randy   DBA        Technology  $6,000

Awk Example 1. Default behavior of Awk

By default Awk prints every line from the file.
$ awk '{print;}' employee.txt
100  Thomas  Manager    Sales       $5,000
200  Jason   Developer  Technology  $5,500
300  Sanjay  Sysadmin   Technology  $7,000
400  Nisha   Manager    Marketing   $9,500
500  Randy   DBA        Technology  $6,000
In the above example pattern is not given. So the actions are applicable to all the lines.
Action print with out any argument prints the whole line by default. So it prints all the
lines of the file with out fail. Actions has to be enclosed with in the braces.

Awk Example 2. Print the lines which matches with the pattern.

$ awk '/Thomas/
> /Nisha/' employee.txt
100  Thomas  Manager    Sales       $5,000
400  Nisha   Manager    Marketing   $9,500
In the above example it prints all the line which matches with the ‘Thomas’ or ‘Nisha’. It has two patterns. Awk accepts any number of patterns, but each set (patterns and its corresponding actions) has to be separated by newline.

Awk Example 3. Print only specific field.

Awk has number of built in variables. For each record i.e line, it splits the record delimited by whitespace character by default and stores it in the $n variables. If the line has 4 words, it will be stored in $1, $2, $3 and $4. $0 represents whole line. NF is a built in variable which represents total number of fields in a record.
$ awk '{print $2,$5;}' employee.txt
Thomas $5,000
Jason $5,500
Sanjay $7,000
Nisha $9,500
Randy $6,000

$ awk '{print $2,$NF;}' employee.txt
Thomas $5,000
Jason $5,500
Sanjay $7,000
Nisha $9,500
Randy $6,000
In the above example $2 and $5 represents Name and Salary respectively. We can get the Salary using  $NF also, where $NF represents last field. In the print statement ‘,’ is a concatenator.

Awk Example 4. Initialization and Final Action

Awk has two important patterns which are specified by the keyword called BEGIN and END.
Syntax: 

BEGIN { Actions}
{ACTION} # Action for everyline in a file
END { Actions }

# is for comments in Awk
Actions specified in the BEGIN section will be executed before starts reading the lines from the input.
END actions will be performed after completing the reading and processing the lines from the input.
$ awk 'BEGIN {print "Name\tDesignation\tDepartment\tSalary";}
> {print $2,"\t",$3,"\t",$4,"\t",$NF;}
> END{print "Report Generated\n--------------";
> }' employee.txt
Name Designation Department Salary
Thomas   Manager   Sales           $5,000
Jason   Developer   Technology   $5,500
Sanjay   Sysadmin   Technology   $7,000
Nisha   Manager   Marketing   $9,500
Randy   DBA     Technology   $6,000
Report Generated
--------------
In the above example, it prints headline and last file for the reports.

Awk Example 5. Find the employees who has employee id greater than 200

$ awk '$1 >200' employee.txt
300  Sanjay  Sysadmin   Technology  $7,000
400  Nisha   Manager    Marketing   $9,500
500  Randy   DBA        Technology  $6,000
In the above example, first field ($1) is employee id. So if $1 is greater than 200, then just do the default print action to print the whole line.

Awk Example 6. Print the list of employees in Technology department

Now department name is available as a fourth field, so need to check if $4 matches with the string “Technology”, if yes print the line.
$ awk '$4 ~/Technology/' employee.txt
200  Jason   Developer  Technology  $5,500
300  Sanjay  Sysadmin   Technology  $7,000
500  Randy   DBA        Technology  $6,000
Operator ~ is for comparing with the regular expressions. If it matches the default action i.e print whole line will be  performed.

Awk Example 7. Print number of employees in Technology department

The below example, checks if the department is Technology, if it is yes, in the Action, just increment the count variable, which was initialized with zero in the BEGIN section.
$ awk 'BEGIN { count=0;}
$4 ~ /Technology/ { count++; }
END { print "Number of employees in Technology Dept =",count;}' employee.txt
Number of employees in Tehcnology Dept = 3
Then at the end of the process, just print the value of count which gives you the number of employees in Technology department.

Recommended Reading

Sed and Awk 101 Hacks, by Ramesh Natarajan. I spend several hours a day on UNIX / Linux environment dealing with text files (data, config, and log files). I use Sed and Awk for all my my text manipulation work. Based on my Sed and Awk experience, I’ve written Sed and Awk 101 Hacks eBook that contains 101 practical examples on various advanced features of Sed and Awk that will enhance your UNIX / Linux life. Even if you’ve been using Sed and Awk for several years and have not read this book, please do yourself a favor and read this book. You’ll be amazed with the capabilities of Sed and Awk utilities.

Additional Awk Articles

Thứ Bảy, 20 tháng 10, 2012

Reverse Proxy

Reverse proxy là một kiểu proxy server. Còn có một loại là forward proxy thế hai kiểu này khác nhau thế nào. Hãy đi vào khái niệm:
  • Forward proxy : Là proxy server nằm trung gian giữa client và orgin server. Để có được nội dung từ orgin server, client gửi một request đến proxy và xác định đích là orgin server, proxy sử dụng đích trong request của client để xác định orgin server sau đó lấy nội dung từ orgin server trả lại cho client. Client được cấu hình để sử dụng forward proxy để truy cập nhiều sites khác nhau. 
  • Reverse proxy : Ngược lại với forward thì reverse đứng giữa server và các clients kết nối đến server đó, vì thế cũng không cần có một cấu hình đặc biệt nào trên client. Proxy lúc này đóng vai trò kiểm soát traffic đến từ các clients đến server. Client tạo các requests yêu cầu nội dung trong name-space của proxy, reverse proxy sau đó quyết định xem cần gửi request đến đâu (server nào), và trả lại nội dung nếu chính nó là orgin server, hoặc từ các server "láng giềng " với reverse proxy.


Forward hay Reverse proxies đều có tác dụng của nó. Reverse proxies có thể
  1. Che dấu đi sự hiện hữu hay những đặc trưng của orgin server.
  2. Nhằm giúp giảm tải cho orgin server reverse có thể cache các nội dung tĩnh như hình ảnh, file text.
  3. Có thể được sử dụng để mã hóa dữ liệu từ client đến server sử dụng SSL, TLS để sử dụng HTTPS, lí do thỉnh thoảng SSL encryption không performed được trên chính con web server.
  4. Load balancing, proxy có thể phân tải đến một vài con web servers, mỗi web phụ trách một vùng ứng dụng của nó. Để làm được việc này có thể proxy phải viết lại các URLs trên mỗi web page.
  5. proxy có thể optimize nội dung bằng việc nén nội dung đó, việc làm đó giúp tăng hiệu quả load.
  6. spoon feeding : caching nội dung web server gửi và "rót" từ từ đến các slow clients nhằm giảm mức độ sử dụng resource của chúng. Điều này có ích đối với các trang web động.
  7. Cấu hình biến proxy thành application firewall có thể chống lại các cuộc tấn công vào các ứng dụng web dựa trên nội dung web
  8. Proxy server có thể được sử dụng bất cứ khi nào nhiều web sites được truy cập và chúng được đặt trên một IP public. Các web servers lắng nghe trên các ports khác nhau của cùng một máy với chung một ip local hoặc là trên các máy khác nhau và các địa chỉ ip local khác nhau. reverse proxy kiểm soát, lọc bỏ các request không hợp lệ và vận chuyển đến các server.

loop forever

Linux / UNIX: Bash Loop Forever

by on January 1, 2011 · 0 comments· last updated at May 19, 2011
I need to cycles through a loop forever using for or while syntax. How do I set such loop under UNIX or Linux operating systems?

The syntax is as follows to cycle through a loop forever using while loop:
while [ 1 ]
do
    command1
    command2
done
 
OR use the following syntax:
 
 while :; do echo 'Hit CTRL+C'; sleep 1; done
 

For loop example

To cycle through a loop forever using for loop:
 
for (( ; ; ))
do
   echo "Pres CTRL+C to stop..."
   sleep 1
done
 

i++

Có 2 cách biểu diễn i=i+1 trong bash shell. Ta có thể sử dụng
1) i=`expr $i + 1`
2) i=$(($i + 1))
Cach thứ nhất yêu cầu giửa $i và + và giữa + và 1 phải có khoảng trắng, cách thứ 2 không cần. Rõ ràng cách thứ 2 thuận tiện hơn

while

Bourne/Bash Shell Script: While Loop Syntax

A while loop allows execution of a code block an arbitrary number of times until a condition is met. This tech-recipe describes the while loop syntax for the various Bourne shells (sh, ksh, bash, zsh, etc.) and provides examples.


The general syntax is as follows:
while [ condition ] do
code block;
done
Any valid conditional expression will work in the while loop. The following code asks the user for input and verifies the input asking for a “y” or “n” and will repeat the process until a “y” answer is received.
verify="n" while [ "$verify" != y ]
do
echo "Enter option: "
read option
echo "You entered $option. Is this correct? (y/n)"
read verify
done
Another useful while loop is a simple one, an infinite loop. If the conditional is “1,” the loop will run until something else breaks it (such as the break keyword).
while [ 1 ] do
ps -ef | grep [s]endmail | wc -l
sleep 5
done
This while loop will display the number of sendmail processes running every five seconds until the loop or executing shell is killed. The brackets in [s]endmail are a regular expression trick that prevents the ‘grep [s]endmail’ process from being counted.

Thứ Tư, 17 tháng 10, 2012

3 nguyên tắc bảo mật

Ba nguyên tắc nền tảng mà HVA bảo mật là:
1. Deny all, allow selective (cản hết, cho phép theo chọn lựa).
2. If not used, turn off (nếu không dùng, tắt bỏ).
3. Your strongest defense is your weakest point (điểm bảo vệ mạnh nhất chính là điểm yếu nhất của bạn).

Thứ Hai, 8 tháng 10, 2012

useradd

In creating the account for testuser, the useradd command performs several actions:
  • Reads the /etc/login.defs file to get default values to use when creating accounts.
  • Checks command-line parameters to find out which default values to override.
  • Creates a new user entry in the /etc/passwd and /etc/shadow files based on the default values and command-line parameters.
  • Creates any new group entries in the /etc/group file.
  • Creates a home directory based on the user’s name and places it in the /home directory.
  • Copies any files located within the /etc/skel directory to the new home directory. This usually includes login and application start-up scripts.
Futher info of /etc/skell  :http://www.linfo.org/etc_skel.html

Changing umask

umask
Think of files as having a default permissions value of 666, and of directories as having a default permissions value of 777.   When it comes to files, only program binaries and scripts need to have the executable permission.  Directories, though, require that the executable permission be set if you want for people to be able to browse through them.  So, there’s a lot better chance that you’ll want to create directories with executable permissions.
A umask is a way of setting a default permissions value for any files or directories that you create on your system.  When you set a umask, you’re telling the system what permissions to remove from the normal default setting.  You’ll see the umask represented by either a three or four digit value.
There is one slight caveat to using umask. When you set the umask on your system, it doesn’t affect the permissions settings for any files or directories that are already there. If you need the permissions settings changed for any pre-existing files or directories, you’ll have to do that yourself after you’ve changed the umask.
There are several ways to change the umask on your system.
If you want to change the global umask setting, then you can edit the /etc/bashrc file.  When you open this file, you should see an “if–else” loop that sets the umask to “002″ for normal users, and to “022″ for the root user.  So, for example, if you want to change the global umask setting for normal users to “077″ just change the “002″ to “077″.
To verify what your umask is, just open a command-line terminal and enter “umask”. You should see a four-digit value such as “0002″. This is really saying that your system’s umask is 002; the extra 0 at the beginning just means that the number is in octal format. You can also use the umask command to temporarily set a umask. Just enter “umask”, followed by the value of the desired umask setting. For example:
umask 077
Note though, that this will only last for the length of your log-in session.
If an individual user wants to make a permanent change to his or her own customized umask, all that’s necessary is to edit the “.bashrc” file in the users’s home directory.  They’ll just need to add a line such as:
umask        077
Here you can see two files created, the first created with the system umas 002 and the second one created after setting the umask to 077.
-rw-rw-r-- 1 joe joe 5 Aug  7 00:25 new
-rw------- 1 joe joe 5 Aug  7 00:26 new2

[8-10-2012] SSH

Một số thuật ngữ mạng
Local computer : là cái máy tính bạn đăng nhập vào và chạy chương trình ssh client
Remote computer (remote host, remote mechine): là cái máy thứ hai, bạn liên lạc với máy này từ máy local. Các máy remote chạy ssh server và liên hệ với local qua SSH. Các máy local và remote có thể là các máy giống nhau.
Local user: người dùng login vào máy local computer.
Remote user: người dùng login vào máy remote computer.
Server: Là một chương trình SSH server.
Server mechine: Là một máy tính chạy chương trình SSH server
Client: một chương trình SSH client.
Client: một máy tính chạy SSH client.

Khi bạn login client để ssh đến remote thì client sẽ xác thực bạn với kết nối được mã hóa, có nghĩa là username, password bạn type sẽ được mã hóa trước khi bạn rời khỏi máy local. SSH server sau đó cho bạn đi vào, toàn bộ phần sau của phiên giao dịch này sẽ được mã hóa khi nó đi giữa client và server. Bởi việc mã hóa hầu như là "trong suốt" nên bạn sẽ không nhận thấy quá nhiều sự khác biệt giữa telnet và ssh.

1.4.2 Secure File Transfer

Giả sử bạn có 2 tài khoản trên 2 máy trong môi trường internet, me@firstaccount.com và metoo@secondaccount.com, bạn muốn truyền một file đi từ tài khoản thứ nhất đến tài khoản thứ hai (me-->metoo). File đó chứa những thông tin quan trọng, tuy nhiên nó  không tránh khỏi những con mắt rình mò!!! Những phương tiện truyền file truyền thống, ví dụ như ftp, rcp, và mail nữa, không cung cấp một giải pháp an toàn. Người thứ ba có thể nghe lén và đọc các gói tin đi qua mạng. Để giải quyết vấn đề này, bạn có thể mã hóa file trên firstaccount.com với chương trình Pretty Good Privacy (PGP), thực hiện truyền file đã mã hóa và giải mã file trên secondaccount.com, nhưng nó như là một công việc buồn tẻ và không trong suốt với người dùng.

Với việc sử dụng SSH, file có thể được truyền một cách an toàn giữa các máy với chỉ một lệnh. Nếu file đó có tên là myfile , command thực thi trên firstacount.com là
$ scp myfile metoo@secondaccount.com

Khi truyền file sử dụng scp, file tự động được mã hóa và rời firstaccount.com và được mã hóa khi đến secondaccount.com.

1.4.3 Secure Remote Command Excution

Giả sử bạn là một người quản trị hệ thống, bạn cần chạy một command trên nhiều máy. Bạn muốn nhìn các active processes của 4 users trên 4 máy khác nhau - grape, lemon, kiwi melon - chúng nằm chung mạng lan và sử dụng command /usr/ucb/w . Bạn có thể sử dụng rsh, cụ thể là rsh daemon, rshd  được cấu hình trên các máy remote

  #!bin/bash                                                    Đây là shell script
 for machine in grape lemon kiwi melon           Duyệt các máy
do
rsh $machine /usr/ucb/w                             Yêu cầu chương trình /usr/ucb/w để liệt kê processes đang chạy
done

Cách thức trên vẫn hoạt động nhưng nó không an toàn. Kết quả cảu /usr/ucb/w  được truyền qua mạng dưới dạng plain text. Trong trường hợp những thông tin trên nhạy cảm thì đây là điều không chấp nhận được. Tồi tệ hơn rằng cơ chế mã hóa rsh  là cực kì kém an toàn và dễ dàng bị phá hoại. Ta sử dụng ssh để thay thế
#!/bin/sh
for machine in grape lemon kiwi melon
do
ssh $machine /usr/ucb/w            Note “ssh” instead of “rsh”
done

Về cơ bản cú pháp nó là giống nhau, kết quả cũng vậy. Nhưng command và kết quả của nó đã được mã hóa và truyền qua mạng, đay là một phương thức xác thực mạnh mẽ khi kết nối với remote.

1.4.4 Key and Agents

Giả sử bạn có các tài khoản trên nhiều máy tính khác nhau trên mạng. Với lí do an toàn, bạn muốn có các tài khoản thì có các mật khẩu khác nhau, nhưng việc nhớ mật khẩu cũng là điều khó khăn. Chắc hẳn bạn đã nhiều lần đánh sai password hay bạn đã từng password thay cho việc nhập username, trên nhiều hệ thống những lỗi đó của bạn có thể lưu lại trong log file và password sẽ bị lộ dưới dạng plaintext. Vậy có cơ chế nhận dạng được chính chúng ta và truy cập đến các tài khoản một cách an toàn mà không cần tiếp tục gõ passwords.

SSH có các cơ chế xác thực phong phú, và an toàn nhất là dựa trên keys hơn là passwords. keys để nhận dạng người dùng SSH, key được giữ mã hóa, nó chỉ có thể sử dụng sau khi nhập pass-phrase để giải mã nó.

Sử dụng các keys đi  cùng với chương trình gọi là authentication agent, SSH có thể xác thực bạn đến tất cả các tài khoản máy tính của bạn một cách an toàn mà không cần yêu cầu bạn nhớ passwords và enter chúng. Nó làm việc như sau
  1. Đặt các file đặc biệt thường được gọi là public key files vào trong các tài khoản ở các máy remote. Enable các SSH clients (ssh, scp) để truy nhập đến remote.
  2. Trên máy local, gọi chương trình ssh-agent, chương trình này chạy trong background.
  3. Chọn key hoặc các key bạn sẽ cần trong quá trình login.
  4. Nạp các keys vào bên trong agent với ssh-add. Nó yêu cầu sự hiểu biết về passphrase.
Yeah! Bạn có một ssh-agent  chạy trên máy local của bạn, và giữ các keys bí mật trong bộ nhớ. Say goodbye với việc nhớ và nhập passwords.

1.4.5 Access Control

Giả sử bạn cho phép một người khác sử dụng máy của bạn nhưng với mục đich rõ ràng. Ví dụ khi bạn đi công tác, bạn muốn cô thư kí check mail của bạn nhưng không được làm bất cứ gì khác trên tài khoản của bạn. Với SSH, bạn có thể cho phép cô thư kí truy cập tài khoản của bạn nhưng không được tiết lộ hay thay đổi password của bạn và chỉ có quyền chạy mail.

1.4.6 Port Forwarding

SSH có thể gia tăng tính bảo một cho một số chương trình ứng dụng dựa trên TCP/IP ví dụ như telnet, ftp và hệ thống X-Window. Một kĩ thuật được gọi là port forwarding hay tunneling tái định tuyến lại kết nối TCP/IP đi qua kết nối SSH mã hóa 2 đầu. Port forwarding có thể cho các ứng dụng qua các firewalls mạng.
Giả sử bạn login vào một máy ở xa nơi làm việc và muốn truy nhập server tin tức nội bộ của công tin bạn , news.yoyodyne.com. Mạng Yoyodyne được kết nối với internet, nhưng firewall mạng blocks các kết nối đến các cổng quan trọng, ví dụ port 119, port tin tức. Firewall cho phép kết nối SSH. SSH có thể thiết lập một secure tunnel trên một port tùy ý, ví dụ port 3002 nằm trên máy local đến port tin tức trên remote host, command có thể : 
$ ssh -L 3002:localhost:119 news.yoyodyne.com

Có thể phát biểu như sau "SSH làm ơn thiết lâp một kết nối an toàn từ TCP port 3002 trên máy local đên TCP port 19, port tin tức trên news.yoyodyne.com". Việc còn lại cấu hình các chương trình tiện ích để đọc tin tức. Các tin tức được đi trên tunnel hoàn toàn được mã hóa.


Chủ Nhật, 7 tháng 10, 2012

Introduction SSH

PREFACE
Riêng tư là nhu cầu căn bản của con người, nhưng trong thế giới mạng máy tính hiện nay, sự riêng tư không được đảm bảo. Quá nhiều dữ liệu đi trên internet hay là mạng cục bộ dưới dạng plain text, các dữ liệu này có thể bị captured bởi bất cứ ai đó với một vài kĩ thuật sơ đẳng. Những lá mail bạn gửi, những files bạn truyền hay những password bạn gõ cõ thể được đọc bởi ai đó . Hãy tưởng tượng sự nguy hiểm nếu dữ liệu này lọt vào bên thứ ba, một đối thủ của bạn

Bảo mật mạng là một vấn đề lớn, các công ti cố gắng bảo vệ thông tin của họ sau firewalls, thiết lập VPNs, các file mã hóa được truyền. Ẩn nấp sau sự nhộn nhịp của vấn đề bảo mật, một vấn đề nhỏ hơn dường như bị  lãng quên, nó thực sự nhỏ quá chăng. Nhưng... nó thực sự đáng tin cậy, dễ dùng, rẻ nữa và có sẵn trong hầu hết các hệ điều hành.

Đó là SSH, Secure Shell

Protect Your Network with SSH

SSH rất rẻ, nó là giải pháp được đưa ra nhằm tránh việc có những ánh mắt soi mói vào dữ liệu trên mạng. Nó không giải quyết tất cả các vấn đề về privacy và bảo mật. Nhưng chúng loại trừ nó một trong số chúng một cách hiệu quả. SSH với những đặc tính chính:
  • An toàn, là một giao thức theo mô hình client/server các dữ liệu giữa hai bên được mã hóa và chuyển đi trên  mạng.
  • Xác thực người dùng sử dụng password, host, hoặc là public key, tích hợp thêm chức năng tương thích với các hệ thống xác thực khác, có thể kể đến như: Kerberos,SecurID, PGP, TIS Gauntlet và PAM.
  • Bổ sung tính bảo mật cho những ứng dụng mạng không an toàn khác như Telnet, FTP, và nhiều chương trình nền tảng TCP/IP, và các giao thức.
  • Chuyển dữ liệu hoàn toàn tới end-user.
  • Cài đặt trên hầu hết các hệ điều hành.

INTRODUCTION 

Ngày nay có những nhu cầu công việc mà ta không thể nào làm trực tiếp được, ví dụ bạn muốn chia sẻ dữ liệu của mình cho đứa bạn thì không thể copy nó vào usb rùi gửi usb cho bạn mình được, à vẫn có thể chứ nhỉ nếu đứa bạn đó sống gần bạn, nhưng nó sẽ khác nếu nó cách bạn nửa vòng trái đất. Ta phải có biện pháp, ta có thể sử dụng ftp và rcp để truyền files, hay để login từ xa ta có thể có telnet hoặc rlogin, hay rsh cho việc thực hiện commands từ xa.

Rủi thay, tất cả các chương trình ta sử dụng phía trên vấp phải một vấn đề căn bản đó là : Kém an toàn. Nếu bạn chuyển một file kém an toàn qua internet. Những vị khách không mời mà đến có thể nghe lén và đọc được dữ liệu của bạn. Điều tồi tệ tương tự khi bạn login sử dụng telnet username và password của bạn có thể bị nghe lén khi nó đi trên mạng.

Làm thế nào để có thể ngăn chặn?  Ta có thể sự dụng các chương trình mã hóa để "trườn" dữ liệu vào trong một secret code mà không ai có thể đọc được. Bạn có thể cài đặt một firewall. Rất nhiều giải pháp còn tùy thuộc vào khả năng tài chính của bạn nữa.

1.1 What is SSH?

SSH, the Secure Shell nó là một phần mềm phổ biến, mạnh mẽ trong bảo mật mạng. Bất cứ khi nào dữ liệu trên máy tính được gửi đến mạng SSH sẽ mã hóa chúng, và tất nhiên là sẽ giải mã chúng. Chúng ta có thể ăn ngon ngủ yên, dữ liệu đã được mã hóa, an toàn rồi!. 

Như đã nói ở trên SSH hoạt động với mô hình client-server. Chương trình SSH server được cài đặt bởi system admin, cho phép hay loại bỏ kết nối đến các host của nó. User có thể chạy chương trính SSH client thực hiện request đên SSH server kiểu như "Làm ơn gửi cho tui một file ", "Làm ơn cho tui login" ,"Thực thi command này dùm với nha" . Tất cả nội dung đó đều được mã hóa và bảo vệ tránh khỏi sự thay đổi theo chiều hướng xấu.

Hãy nhớ rằng việc giao tiếp giữa client và server luôn được mã hóa.

Nếu bạn là một người dùng Unix, Hãy nghĩ rằng SSH như là một dạng an toàn của Unix r-commands: rsh(remote shell), rlogin(remote login), rcp(remote copy). SSH của Unix là: ssh, scp, slogin. Nếu bạn đang sử dụng r-commands đề nghị chuyển sang xái ssh ngay lập tức.

1.2 What SSH Is Not

SSH tuy là viết tắt của Secure Shell nhưng nó không thực sự là Shell chính nghĩa như Bourne Shell, C Shell của Unix, nó không có những command interpreter hay cung cấp wildcard expansion, command history... SSH tạo ra một kênh cho việc chạy các Shell trên các remote computer.

SSH hoàn toàn không giải quyết tất cả mọi vấn đề về security, nó không thể bảo vệ bạn khỏi những cuộc tấn công DDOS, nó không bảo vệ bạn khỏi những mối rủi ro khác như : viruses, trojan horses, và coffee spills. Nó cung cấp một cơ chế xác thực và mã hóa mạnh mẽ cũng như thân thiện.

1.3 The SSH Protocol 

SSH là một giao thức, không phải là một sản phẩm. Nó hướng dẫn làm cách nào để có giao tiếp an toàn trên mạng.

SSH protocol bao trùm việc mã hóa, chứng thực, bảo toàn dữ liệu truyền qua mạng

Authentication

Xác định đặc điểm nhận dạng của một ai đó. Nếu bạn cố gắng login một tài khoản nào đó trên máy tính ở xa. SSH yêu cầu bạn phải cung cấp bằng chứng. Nếu bạn vượt qua bài test của nó, bạn được login, ngược lại nó sẽ chặn bạn lại.

Encyption

"Trườn" dữ liệu của bạn đến các dạng khó tiếp thu. Nó bảo vệ dữ liệu của bạn khi đi qua mạng

Ngắn gọ hơn, SSH tạo các kết nối mạng giữa các máy tính, vơi sự đảm bảo cao rằng hai bên đang giao tiếp với nhau là thật (không có sự giả mạo). Dữ liệu sẽ không bị thay đổi và đọc được bởi những người nghe trộm.

1.3.1 Protocols, Products, Clients and Confusion

SSH-based products là sản phẩm cài đặt giao thức SSH tồn tại trên nhiều hệ điều hành khác nhau như: Unix, Windows, Macintosh và các hệ điều hành khác.

Sản phẩm SSH đầu tiên được tạo ra bởi Tatu Ylönen viết cho hđh Unix, nó được gọi với cái tên đơn giản là "SSH". Nhầm lẫn phát sinh vì SSH cũng là tên một giao thức. Một vài người gọi phần mềm của Tatu Ylönen là "Unix SSH". Vì thế trong các phần sau ta quy định
  • Protocols được kí hiệu với dấu gạch ngang: SSH-1, SSH-2.
  • Các sản phẩm được viết hoa nhưng không có gạch ngang: SSH1, SSH2.
  • Các chương trình người dùng được viết bằng chữ thường : ssh, ssh1, ssh2...

1.4 Overview of SSH Features

Vậy SSH có thể làm gì? Chúng ta hãy xét một vài ví dụ để hiểu thêm các đặc tính chính của SSH như secure remote logins, secure file copying, secure invocation of remote commands. Chúng ta sử dụng SSH1 trong các ví dụ, nhưng nó có thể thực hiện với OpenSSH, SSH2, và F-Secure SSH

1.4.1 Secure Remote Logins

Giả sử bạn có một vài tài khoản trên một vài máy tính. Bạn kết nối máy home PC đến ISP của bạn, và sau đó bạn sử dụng chương trình telnet để login vào một tài khoản khác trên một máy tính khác (dĩ nhiên là của bạn). Thật không may mắn, telnet chuyển username và password dưới dạng plain text trên internet, internet nơi có sẵn những kẻ có thừa dã tâm có thể nghe lén bạn. Thêm nữa những phần còn lại của phiên telnet đó còn có thể bị đọc bởi những đứa rình mò khác.

...... Còn nữa, ngủ cái đã.



Thứ Bảy, 6 tháng 10, 2012

Định nghĩa Filesystem

  • Bài viết nhỏ này mình xin chia sẻ một chút về filesystem. Nhắc đến Linux chắc hẳn bạn đã từng nghe qua thuật ngữ “filesystem”. Vậy Filesystem là gì? Từ filesystem có 2 nghĩa: nó có thể là một đĩa (disk) hoặc là một mạng(network) phụ thuộc vào cấu trúc dữ liệu được dùng để lưu trữ các file. Nó có thể là một hệ thống phân cấp các thư mục và files trên một đĩa(hierachy). Theo nghĩa thứ hai, thì các thư mục và files được sắp xếp một cách logic mà ta có thể sử dụng các thao tác command trên Linux để xem được nó, ví dụ sử dụng câu lệnh ls (mình xin phân tích câu lệnh này ở bài sau).  Nếu một người nói “I have two filesystems” có nghĩa là người đó có hai phân vùng(partition) để họ lưu dữ liệu trên đó hoặc là họ sử dụng “extended filesystem” (nó là ext2fs hoặc là ext2).
  • Sự khác nhau giữa disk hay partition và filesystem được chứa trong nó thực sự quan trọng. Hầu hết các chương trình làm việc trên một filesystem nào đó, do đó chương trình sẽ không làm việc trên một partition mà không chứa filesystem đó(hoặc có chứa nhưng mà sai kiểu filesystem).
  • Sức mạnh của  Linux nằm ở việc nó cung cấp một số lượng rộng rãi các filesystem, không chỉ ở ext2 filesystem(filesystem của Linux) mà nó còn cung cấp nhiều filesystem của các HĐH khác như Windows, MAC và các HĐH khác nữa. Lợi điểm của sự “phóng khoáng” trên là ta có thể đọc các dữ liệu (media) hay là đĩa cứng(hard disk ) từ các máy tính sử dụng HĐH khác.
  • Sau đây mình xin liệt kê một vài hệ thống filesystem từ đời cổ đến thời hiện đại :d
  1. Minix: cổ nhất, được cho là đáng tin cậy nhất, nhưng nó giới hạn một vài features(thỉnh thoảng một vài nhãn (stamps) bị mất hay là tên file tối đa chỉ là 30 kí tự), về dung lượng (tối đa là 64M cho một filesystem).
  2. Xia: một phiên bản chỉnh sửa của Minix, giới hạn tên file và kích thước của filesystem được nâng lên, nó không phổ biến nhưng những báo cáo cho thấy nó làm việc rất tốt(chả hiểu tại sao không phổ biến nhể???)
  3. Ext3: là hệ thống filesystem có tất cả các đặc trưng của ext2, nó cải thiện hơn ở việc journaling(bản ghi) được thêm vào, vì thế nó cải thiện đc performance hoặc recovery time khi hệ thông bị phá hủy. Nó phổ biến hơn ext2
  4. Ext2: Nó có những đặc tính tự nhiên của Linux filesystems. Nó thiết kế để dễ dàng nâng cấp, vì thế ta hoàn toàn có thể có new versions mà không cần mà không cần tạo lại toàn bộ filesystem.
  5. Ext: là phiên bản cũ hơn ext2 nó không có cơ chế cho phép dễ dàng nâng cấp. Rất khó trong việc cài đặt new versions.
  6. Reiserfs: một filesystem nhiều “sức mạnh”. Bản ghi được sử dụng hạn chế mức thấp việc mất dữ liệu. Bản ghi những công việc đã thực thi. Nó cho phép filesystem tự cấu trúc lại một cách dễ dàng sau những đe dọa, ví dụ như tắt máy không thích hợp.
  7. Xfs: đươc thiết kế bởi Silicon Graphics làm việc như một filesystem 64 bit, nó được thiết kế nhằm duy trì performance cao với một lượng lớn files và filesystems
  • Thêm vào đó, nó còn supports thêm nhiều filesystem bên ngoài khác, tạo ra việc dễ dàng cho việc trao đổi files với các hệ điều hành khác nhau. Các hệ thống filesystem ngoại này làm việc cũng giống như các hệ thống tự nhiên trong Linux. Ví dụ
  1. Msdos: tương thích vơi MS-DOS (và OS/2 và Windows NT) FAT filesystems
  2. Umsdos: là một mở rộng của msdos filesystem với tên file dài hơn, nhiều người sở hữu, nhiều quyền hạn, nhiều liên kết và các files thiết bị. Nó cho phép một msdos filesystem thông thường được sử dụng như một filesystem Linux duy nhất mà không cần phân vùng cho Linux.
  3. Vfat: mở rộng của FAT được biết đến với cái tên FAT32. Nó cung cấp một kích thước đĩa lớn hơn FAT. Hầu hết các đĩa MS windows là vfat
  4. Iso9660: là CD-ROM filesystem chuẩn, ROCK RIDGE là một mở rộng cho phép tên file dài hơn được cung cấp một cách tự động
  5. Nfs: là một filesystem mạng cho phép chia sẻ một filesystem nào đó giữa các máy tính để dễ dàng truy cập đến tất cả các file đó
  6. Smbfs: là filesystem mạng cho phép chia sẻ một filesystem nào đó với một MS Windows. Nó tương thích với các giao thức chia sẻ file Windows.
  7. Hpfs: là OS/2 filesystem.
  8. Sysv: hệ thống V/386, Xenix file systems.
  9. NTFS: một Microsoft filesystem nâng cao cung cấp một cơ chế truy cập file nhanh hơn.

Custormizing your promt

Ngồi nghịch mấy cái bash shell Linux thấy thích thích, chia sẻ cho anh em một xíu, ví dụ đơn giản nhất: Thay đổi promt của chúng ta:
Promt của mình [root@toet ~]#
Mình dùng
 [root@toet~]#export PS1='[\d@\h\w]$'
kết quả thu được
[Fri Sep 28@toet~]#
Trong ví dụ trên mình đã đổi  '[\u@\h\w]#' thành '[\d@\h\w]#' nghĩa là user trong promt đổi thành thông số ngày tháng.
Minh xin phân tích một chút. Về Promt(dấu nhắc) nó nhắc nhở bạn rằng shell đã sẵn sàng nhận input từ bạn. Giá trị mặc định của nó phụ thuộc vào hệ thống bạn dùng. Mình dùng CentOS, bash của mình là  [user@host~]# ([\u@\h\w]). Trong đó
  • user: có thể là root hoặc một người dùng bình thường
  • host: là tên máy của mình.
  • ~: là thư mục nhà của user đối với user root nhà của nó nằm ở /root, user bình thường sẽ nằm ở /home/user. ví dụ mình có user lytoet thì nó có nhà ở /home/lytoet.
  • #: nó thể hiện mình đang có quyền root, nếu là user bình thường thì là dấu $
  • PS1(Promt String 1): nó thực chất là một biến shell (shell variable). Lại liên quan đến một khái niệm biến Shell. Vậy nó là gì?
  1. Biến Shell là gì?
  • Trong suốt quá trình thực thì bash duy trì một tập hợp các biến shell chứa các thông tin quan trọng trong việc thực thi của shell. Hầu hết các biến này được set khi khi bash khởi động, nhưng bất cứ lúc nào chúng ta cũng có thể set lại giá trị cho chúng.
  • Quay trở lại với PS1 đó là một biến đặc biệt giữ nội dung của command promt, nó được thấy khi bash sắn sàng chấp nhận commands. Ta có thể sử dụngecho command để hiện nội dụng của PS1 mình ví dụ: 
[Fri Sep 28@toet~]$echo $PS1
Kết quả
[\d@\h\w]$
  •  Các tùy chọn có thể kể đến như \d (date), \h(host), \w(là nơi đang thao tác), /u(username).\n xuống dòng, các bạn tự thử (google).
  • Lệnh echo ở trên chỉ cho ta xem được nội dụng chứ hoàn toàn không tác động đến promt ta sử dụng export . các bạn man export để biết thêm.
  • Các bạn sử dụng cách trên để "nghịch " thêm
  1. Hiện giờ phút giây
  2. Hiện bash version
  • In ra tổng số tiến trình(jobs) mà shell đang quản lí.(việc này hữu dụng khi bạn chạy nhiều background jobs mà không nhớ được chúng).

Getting Information About Files

Đặt vấn đề

Bạn cần nhiều thông tin về file, ví dụ đó là file gì ?, ai sở hữu nó ? Nếu nó có thể thực thi thì nó thì nó có bao nhiêu links cứng? Lần thay đổi cuối cùng là khi nào?

Giải quyết

Sử dụng các lệnh ls, stat, file hoặc find

Mình tạo một file có tên get_info nằm trong thư mục tmp:
[root@toet ~]# touch /tmp/get_info

Mình sử dụng lệnh ls
[root@toet ~]# ls /tmp/get_info

Kết quả:
/tmp/get_info

Lệnh ls không có các tùy chọn thì chỉ liệt kê được đường dẫn đến file.
Mình sử dụng tùy chọn -l : [root@toet ~]# ls -l /tmp/get_info
Kết quả : -rw-r--r-- 1 root root 0 Sep 29 01:56 /tmp/get_info
Tùy chọn -l cho ta thông tin chi tiết hơn về file. Mình giải thích một vài thông số:
  • -rw-r--r-- : Đây là quyền truy cập vào file.
  • root root : lần lượt là user sở hữu và nhóm sở hữu file.
  • 0 : là số liên kết đến file.
  • Sep 29 01:56 : thời gian sửa đổi cuối cùng.
  • /tmp/get_info : là tên gọi, là đường dẫn.
Một số tùy chọn cũng như thông số khác các bạn có thể man ls để tìm hiểu thêm. ^_^

Mình sử dụng lênh stat (status): Lệnh stat cho ta thấy được trạng thái của file hoặc filesystem
[root@toet ~]# stat /tmp/get_info
Kết quả
  File: `/tmp/get_info'  Size: 0               Blocks: 0          IO Block: 4096   regular empty fileDevice: 801h/2049d   Inode: 2883593  Links: 1Access: (0644/-rw-r--r--)  Uid: (   0/  root)
Gid: (  0/    root) Access: 2012-09-29 01:56:09.000000000 +0700Modify: 2012-09-29 01:56:09.000000000 +0700Change: 2012-09-29 01:56:09.000000000 +0700

Một mớ :) Các chỉ số UID, GID, Inode rất có ý nghĩa và thực sự quan trọng khi ta nghiên cứu về cấu trúc file.
Trong Linux có nhiều kiểu file: Linux không yêu cầu phần mở đuôi file. Mình lấy ví dụ:
Mình tạo một file có tên type_file.txt (có đuôi txt): [root@toet ~]# touch /tmp/type_file.txt
Mình sử dụng lệnh file để xem kiểu của file này: [root@toet ~]# file /tmp/type_file.txt
Kết quả :
/tmp/type_file.txt: empty
Tiếp tục:
[root@toet ~]# file /tmp/get_info
Kết quả:
/tmp/get_info: empty
 Hai kết quả giống nhau và ta biết chúng là những file cùng kiểu, file bình thường.
Mình thử file thêm :
[root@toet ~]# file /etc/passwd
Kết quả:
/etc/passwd: ASCII text
Oh! kiểu của con này khác 2 con trên, ta nhận ra rằng file trong linux có kiểu không dựa vào đuôi. file trên có kiểu ASCII text.

Một điều cần nhớ là trên Linux tất cả mọi thứ đều là file, nếu không phải là file thì nó là một process.

Ta sử dụng lệnh find để  tìm kiếm các file trong một cây thư mục. Ví dụ mình muốn tìm file
file_type.txt hồi nãy thì mình tìm tất cả các file trong thư mục /tmp và có đuôi .txt:
[root@toet ~]# find /tmp/ -name "*.txt"
Kết quả:
/tmp/type_file.txt
/tmp/a.txt
Đúng như ý muốn. Một vài thông số
  • -name : tìm kiếm theo tên
  • "*.txt" : Tất cả các file có đuôi là txt.
Lệnh find rất hay và hữu dụng khi bạn sở hữu một lượng lớn files.
Ta có thể tìm kiếm theo tên ví dụ tìm kiếm file có tên get_info trong thư mục /tmp:
[root@toet ~]# find /tmp -name get_info
Kết quả:
/tmp/get_info

Có thể việc làm trên khá "ngây" khi chỉ việc ls là có kết quả rùi đúng không. OK một ví dụ khác.
Bạn muốn tìm file cấu hình của httpd đi dĩ nhiên bạn biết tên nó, nó là httpd.conf, muốn dùng được find thì ta cần phải biết thêm rằng tìm ở đâu, bước này phụ thuộc vào kình nghiệp, kinh nghiệm ở đây là hầu hết các file cấu hình dịch vụ nằm ở /etc, bắt đầu nào:
[root@toet ~]# find /etc/ -name "httpd.conf"

Kết quả:
/etc/httpd/conf/httpd.conf

Cũng lợi hại đúng không :D
Một điều mình nhận ra đó là nếu mình có thêm một file khác trong thư mục tmp giả sử là get_info.tar nếu mình chỉ dùng find /tmp -name get_info sẽ không hiện được file trên.
Ta sử lí việc trên sử dụng :
[root@toet ~]# find /tmp/ -name get_info\*

Kết quả :
/tmp/get_info.tar
/tmp/get_info

Find có thể tìm kiếm theo kiểu file, theo thời gian sửa đổi cuối cùng. Có thể tìm các tập tin tạo trong ngày hôm nay, ngày hôm qua... Nhiều lắm cứ google nha.
Hi, Đang ngâm cứu về DDOS thấy cái này hay nên muốn chía sẻ.
Hình ảnh phía trên là sơ đồ trạng thái kết nối TCP, mình nhấn mạnh nó rất quan trọng, đặc biệt với dân mạng chúng ta khi nghiên cứu về TCP/IP.

Mình xin đi thẳng.
I. Quá trình bắt tay 3 bước (three-way handshake )
Ta chú ý vào 2 vòng tròn có sô 1 nằm trong (mình tạm gọi là (1)): Ban đầu bên client (màu xanh) server (màu cam).

Mình giả sử thằng client (active open) muốn kết nối với server (passive open)

Client muốn kết nối đến server nó phải trải qua quá trình bắt tay ba bước:
Bắt tay thứ nhất: (1) client tự nhân cờ SYN từ chính nó và chuyển qua trạng thái SYN_SENT, cùng lúc này thằng server cũng nhận SYN từ client và chuyển trạng thái nó thành SYN_RCVD.
Bắt tay thứ hai: (2) client nhận SYN và ACK từ server và chuyển thành ESTABLISHED
Bắt tay thứ ba: (3) Server nhận ACK từ client và chuyển thành ESTABLISH

client Server
1. CLOSED LISTEN
2. SYN-SENT --> <SEQ=100><CTL=SYN> --> SYN-RECEIVED
3. ESTABLISHED <-- <SEQ=300><ACK=101><CTL=SYN,ACK> <-- SYN-RECEIVED
4. ESTABLISHED --> <SEQ=101><ACK=301><CTL=ACK> --> ESTABLISHED
5. ESTABLISHED --> <SEQ=101><ACK=301><CTL=ACK><DATA> --> ESTABLISHED Basic 3-Way Handshake for Connection Synchronization

Mình giải thích một chút về sờ đồ trên
kí hiêu --> chỉ sự chuyển dời TCP segment từ client đến server, <-- là TCP segment từ Server đên client.

Trạng thái của TCP sẽ đổi sau khi TCP segment dời đi.
SEQ : số sequence
CTL: cờ điều khiển (control flags)
ACK : trường ACK

Dòng 1 :
Ban đầu thăng client ở trang thái CLOSED : nghĩa là client chưa có kết nối nào
Trạng thái ban đầu của server là LISTEN : server đang đợi một kết nối từ client.

Các dòng 2,3,4 đều giống như quá trình mình phân tích ở trên.
Riêng dòng 5 client gửi ACK và kèm theo dữ liệu, chú ý răng SEQ, ACK hoàn toàn giống ở bước 4.

Bước 5 khá thú vị! Bởi nó như một "mũi tên trúng hai đích" vậy, vừa gửi ACK để hoàn thành bắt tay, vừa " đi ké" được dữ liệu. Đi ké nhưng vẫn đúng luật giao thông :D bởi vì TCP stacks ngày nay cho phép gửi dữ liệu trong ACK PACKET. Thực ra ta có thể gửi từ bước 4.
Những dữ liệu ké có thể kể đến như gói HTTP request.

Các ví dụ trên thiết lập kết nối đối với một bên CLOSED một bên LISTEN . Nếu cả client lấn Server đều CLOSED

Hãy thử phân tích sơ đồ sau
client server
1. CLOSED CLOSED
2. SYN-SENT --> <SEQ=100><CTL=SYN> ...
3. SYN-RECEIVED <-- <SEQ=300><CTL=SYN> <-- SYN-SENT
4. ... <SEQ=100><CTL=SYN> --> SYN-RECEIVED
5. SYN-RECEIVED --> <SEQ=100><ACK=301><CTL=SYN,ACK> ...
6. ESTABLISHED <-- <SEQ=300><ACK=101><CTL=SYN,ACK> <-- SYN-RECEIVED
7. ... <SEQ=101><ACK=301><CTL=ACK> --> ESTABLISHED

kí hiệu .... đó chính là độ delay (TCP segment ta gửi vẫn còn nằm trên mạng chưa được nhận)
Dòng 1 : cho ta biết trạng thái TCP client và server đều là CLOSED
Dòng 2: client gửi SYN do Server đang ở CLOSED (vì nó cũng muốn gửi SYN)nên nó tạm thời không nhận TCP segment từ client.
Dòng 3: Server gửi SYN, do client đang ở SYN-SENT nhận SYN từ server sẽ chuyển thánh SYN-RECIEVED
Dòng 4: client tiếp tục công việc dang dở ở bước 2, nó lại gửi cái SYN i chang, server nhận SYN nên chuyển thành SYN-RECEIVED
Dòng 5: Do client gửi SYN-SENT trước nó được quyền đáp trả SYN,ACK trước, nhưng server (cũng muốn đáp trả SYN,ACK) không nhận vì nếu nhận nó sẽ rơi vào ESTABLISHED và không thể gửi SYN,ACK được
Dòng 6: Do Client đã gửi SYN,ACK(dù chưa được nhận) nên "cờ" lại về tay server nó thực hiện gửi SYN,ACK, client nhận được SYN,ACK chuyển thành ESTABLISHED
Dòng 7: giờ thì server không còn "nhu cầu " gì nữa, nó nhận ACK từ client để chuyển thành ESTABLISHED.

Quá trình trên thực hiện sole nhau giữa client và server, thằng nào gửi SYN-SENT trước sẽ kết thúc trước, gửi sau kết thúc sau

Phần sau mình nói về các trạng thái khác như TIME_WAIT, CLOSE_WAIT...