728x90

INFORMATIONAL
Errata Exist

Internet Engineering Task Force (IETF)                        D. M'Raihi
Request for Comments: 6238                                Verisign, Inc.
Category: Informational                                       S. Machani
ISSN: 2070-1721                                         Diversinet Corp.
                                                                  M. Pei
                                                                Symantec
                                                               J. Rydell
                                                          Portwise, Inc.
                                                                May 2011


              

TOTP: Time-Based One-Time Password Algorithm

Abstract This document describes an extension of the One-Time Password (OTP) algorithm, namely the HMAC-based One-Time Password (HOTP) algorithm, as defined in RFC 4226, to support the time-based moving factor. The HOTP algorithm specifies an event-based OTP algorithm, where the moving factor is an event counter. The present work bases the moving factor on a time value. A time-based variant of the OTP algorithm provides short-lived OTP values, which are desirable for enhanced security. The proposed algorithm can be used across a wide range of network applications, from remote Virtual Private Network (VPN) access and Wi-Fi network logon to transaction-oriented Web applications. The authors believe that a common and shared algorithm will facilitate adoption of two-factor authentication on the Internet by enabling interoperability across commercial and open-source implementations. Status of This Memo This document is not an Internet Standards Track specification; it is published for informational purposes. This document is a product of the Internet Engineering Task Force (IETF). It represents the consensus of the IETF community. It has received public review and has been approved for publication by the Internet Engineering Steering Group (IESG). Not all documents approved by the IESG are a candidate for any level of Internet Standard; see Section 2 of RFC 5741. Information about the current status of this document, any errata, and how to provide feedback on it may be obtained at http://www.rfc-editor.org/info/rfc6238. M'Raihi, et al. Informational [Page 1]


RFC 6238                      HOTPTimeBased                     May 2011


Copyright Notice

   Copyright (c) 2011 IETF Trust and the persons identified as the
   document authors.  All rights reserved.

   This document is subject to BCP 78 and the IETF Trust's Legal
   Provisions Relating to IETF Documents
   (http://trustee.ietf.org/license-info) in effect on the date of
   publication of this document.  Please review these documents
   carefully, as they describe your rights and restrictions with respect
   to this document.  Code Components extracted from this document must
   include Simplified BSD License text as described in Section 4.e of
   the Trust Legal Provisions and are provided without warranty as
   described in the Simplified BSD License.

Table of Contents

   1. Introduction ....................................................2
      1.1. Scope ......................................................2
      1.2. Background .................................................3
   2. Notation and Terminology ........................................3
   3. Algorithm Requirements ..........................................3
   4. TOTP Algorithm ..................................................4
      4.1. Notations ..................................................4
      4.2. Description ................................................4
   5. Security Considerations .........................................5
      5.1. General ....................................................5
      5.2. Validation and Time-Step Size ..............................6
   6. Resynchronization ...............................................7
   7. Acknowledgements ................................................7
   8. References ......................................................8
      8.1. Normative References .......................................8
      8.2. Informative References .....................................8
   Appendix A. TOTP Algorithm: Reference Implementation ...............9
   Appendix B. Test Vectors ..........................................14

1. Introduction

1.1. Scope

This document describes an extension of the One-Time Password (OTP) algorithm, namely the HMAC-based One-Time Password (HOTP) algorithm, as defined in [RFC4226], to support the time-based moving factor. M'Raihi, et al. Informational [Page 2]


RFC 6238                      HOTPTimeBased                     May 2011


1.2. Background

As defined in [RFC4226], the HOTP algorithm is based on the HMAC-SHA-1 algorithm (as specified in [RFC2104]) and applied to an increasing counter value representing the message in the HMAC computation. Basically, the output of the HMAC-SHA-1 calculation is truncated to obtain user-friendly values: HOTP(K,C) = Truncate(HMAC-SHA-1(K,C)) where Truncate represents the function that can convert an HMAC-SHA-1 value into an HOTP value. K and C represent the shared secret and counter value; see [RFC4226] for detailed definitions. TOTP is the time-based variant of this algorithm, where a value T, derived from a time reference and a time step, replaces the counter C in the HOTP computation. TOTP implementations MAY use HMAC-SHA-256 or HMAC-SHA-512 functions, based on SHA-256 or SHA-512 [SHA2] hash functions, instead of the HMAC-SHA-1 function that has been specified for the HOTP computation in [RFC4226].

2. Notation and Terminology

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in [RFC2119].

3. Algorithm Requirements

This section summarizes the requirements taken into account for designing the TOTP algorithm. R1: The prover (e.g., token, soft token) and verifier (authentication or validation server) MUST know or be able to derive the current Unix time (i.e., the number of seconds elapsed since midnight UTC of January 1, 1970) for OTP generation. See [UT] for a more detailed definition of the commonly known "Unix time". The precision of the time used by the prover affects how often the clock synchronization should be done; see Section 6. R2: The prover and verifier MUST either share the same secret or the knowledge of a secret transformation to generate a shared secret. R3: The algorithm MUST use HOTP [RFC4226] as a key building block. M'Raihi, et al. Informational [Page 3]


RFC 6238                      HOTPTimeBased                     May 2011


   R4: The prover and verifier MUST use the same time-step value X.

   R5: There MUST be a unique secret (key) for each prover.

   R6: The keys SHOULD be randomly generated or derived using key
       derivation algorithms.

   R7: The keys MAY be stored in a tamper-resistant device and SHOULD be
       protected against unauthorized access and usage.

4. TOTP Algorithm

This variant of the HOTP algorithm specifies the calculation of a one-time password value, based on a representation of the counter as a time factor.

4.1. Notations

o X represents the time step in seconds (default value X = 30 seconds) and is a system parameter. o T0 is the Unix time to start counting time steps (default value is 0, i.e., the Unix epoch) and is also a system parameter.

4.2. Description

Basically, we define TOTP as TOTP = HOTP(K, T), where T is an integer and represents the number of time steps between the initial counter time T0 and the current Unix time. More specifically, T = (Current Unix time - T0) / X, where the default floor function is used in the computation. For example, with T0 = 0 and Time Step X = 30, T = 1 if the current Unix time is 59 seconds, and T = 2 if the current Unix time is 60 seconds. The implementation of this algorithm MUST support a time value T larger than a 32-bit integer when it is beyond the year 2038. The value of the system parameters X and T0 are pre-established during the provisioning process and communicated between a prover and verifier as part of the provisioning step. The provisioning flow is out of scope of this document; refer to [RFC6030] for such provisioning container specifications. M'Raihi, et al. Informational [Page 4]


RFC 6238                      HOTPTimeBased                     May 2011


5. Security Considerations

5.1. General

The security and strength of this algorithm depend on the properties of the underlying building block HOTP, which is a construction based on HMAC [RFC2104] using SHA-1 as the hash function. The conclusion of the security analysis detailed in [RFC4226] is that, for all practical purposes, the outputs of the dynamic truncation on distinct inputs are uniformly and independently distributed strings. The analysis demonstrates that the best possible attack against the HOTP function is the brute force attack. As indicated in the algorithm requirement section, keys SHOULD be chosen at random or using a cryptographically strong pseudorandom generator properly seeded with a random value. Keys SHOULD be of the length of the HMAC output to facilitate interoperability. We RECOMMEND following the recommendations in [RFC4086] for all pseudorandom and random number generations. The pseudorandom numbers used for generating the keys SHOULD successfully pass the randomness test specified in [CN], or a similar well-recognized test. All the communications SHOULD take place over a secure channel, e.g., Secure Socket Layer/Transport Layer Security (SSL/TLS) [RFC5246] or IPsec connections [RFC4301]. We also RECOMMEND storing the keys securely in the validation system, and, more specifically, encrypting them using tamper-resistant hardware encryption and exposing them only when required: for example, the key is decrypted when needed to verify an OTP value, and re-encrypted immediately to limit exposure in the RAM to a short period of time. The key store MUST be in a secure area, to avoid, as much as possible, direct attack on the validation system and secrets database. Particularly, access to the key material should be limited to programs and processes required by the validation system only. M'Raihi, et al. Informational [Page 5]


RFC 6238                      HOTPTimeBased                     May 2011


5.2. Validation and Time-Step Size

An OTP generated within the same time step will be the same. When an OTP is received at a validation system, it doesn't know a client's exact timestamp when an OTP was generated. The validation system may typically use the timestamp when an OTP is received for OTP comparison. Due to network latency, the gap (as measured by T, that is, the number of time steps since T0) between the time that the OTP was generated and the time that the OTP arrives at the receiving system may be large. The receiving time at the validation system and the actual OTP generation may not fall within the same time-step window that produced the same OTP. When an OTP is generated at the end of a time-step window, the receiving time most likely falls into the next time-step window. A validation system SHOULD typically set a policy for an acceptable OTP transmission delay window for validation. The validation system should compare OTPs not only with the receiving timestamp but also the past timestamps that are within the transmission delay. A larger acceptable delay window would expose a larger window for attacks. We RECOMMEND that at most one time step is allowed as the network delay. The time-step size has an impact on both security and usability. A larger time-step size means a larger validity window for an OTP to be accepted by a validation system. There are implications for using a larger time-step size, as follows: First, a larger time-step size exposes a larger window to attack. When an OTP is generated and exposed to a third party before it is consumed, the third party can consume the OTP within the time-step window. We RECOMMEND a default time-step size of 30 seconds. This default value of 30 seconds is selected as a balance between security and usability. Second, the next different OTP must be generated in the next time- step window. A user must wait until the clock moves to the next time-step window from the last submission. The waiting time may not be exactly the length of the time step, depending on when the last OTP was generated. For example, if the last OTP was generated at the halfway point in a time-step window, the waiting time for the next OTP is half the length of the time step. In general, a larger time- step window means a longer waiting time for a user to get the next valid OTP after the last successful OTP validation. A too-large window (for example, 10 minutes) most probably won't be suitable for typical Internet login use cases; a user may not be able to get the next OTP within 10 minutes and therefore will have to re-login to the same site in 10 minutes. M'Raihi, et al. Informational [Page 6]


RFC 6238                      HOTPTimeBased                     May 2011


   Note that a prover may send the same OTP inside a given time-step
   window multiple times to a verifier.  The verifier MUST NOT accept
   the second attempt of the OTP after the successful validation has
   been issued for the first OTP, which ensures one-time only use of an
   OTP.

6. Resynchronization

Because of possible clock drifts between a client and a validation server, we RECOMMEND that the validator be set with a specific limit to the number of time steps a prover can be "out of synch" before being rejected. This limit can be set both forward and backward from the calculated time step on receipt of the OTP value. If the time step is 30 seconds as recommended, and the validator is set to only accept two time steps backward, then the maximum elapsed time drift would be around 89 seconds, i.e., 29 seconds in the calculated time step and 60 seconds for two backward time steps. This would mean the validator could perform a validation against the current time and then two further validations for each backward step (for a total of 3 validations). Upon successful validation, the validation server can record the detected clock drift for the token in terms of the number of time steps. When a new OTP is received after this step, the validator can validate the OTP with the current timestamp adjusted with the recorded number of time-step clock drifts for the token. Also, it is important to note that the longer a prover has not sent an OTP to a validation system, the longer (potentially) the accumulated clock drift between the prover and the verifier. In such cases, the automatic resynchronization described above may not work if the drift exceeds the allowed threshold. Additional authentication measures should be used to safely authenticate the prover and explicitly resynchronize the clock drift between the prover and the validator.

7. Acknowledgements

The authors of this document would like to thank the following people for their contributions and support to make this a better specification: Hannes Tschofenig, Jonathan Tuliani, David Dix, Siddharth Bajaj, Stu Veath, Shuh Chang, Oanh Hoang, John Huang, and Siddhartha Mohapatra. M'Raihi, et al. Informational [Page 7]


RFC 6238                      HOTPTimeBased                     May 2011


8. References

8.1. Normative References

[RFC2104] Krawczyk, H., Bellare, M., and R. Canetti, "HMAC: Keyed- Hashing for Message Authentication", RFC 2104, February 1997. [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, March 1997. [RFC4086] Eastlake 3rd, D., Schiller, J., and S. Crocker, "Randomness Recommendations for Security", BCP 106, RFC 4086, June 2005. [RFC4226] M'Raihi, D., Bellare, M., Hoornaert, F., Naccache, D., and O. Ranen, "HOTP: An HMAC-Based One-Time Password Algorithm", RFC 4226, December 2005. [SHA2] NIST, "FIPS PUB 180-3: Secure Hash Standard (SHS)", October 2008, <http://csrc.nist.gov/publications/fips/ fips180-3/fips180-3_final.pdf>.

8.2. Informative References

[CN] Coron, J. and D. Naccache, "An Accurate Evaluation of Maurer's Universal Test", LNCS 1556, February 1999, <http://www.gemplus.com/smart/rd/publications/pdf/ CN99maur.pdf>. [RFC4301] Kent, S. and K. Seo, "Security Architecture for the Internet Protocol", RFC 4301, December 2005. [RFC5246] Dierks, T. and E. Rescorla, "The Transport Layer Security (TLS) Protocol Version 1.2", RFC 5246, August 2008. [RFC6030] Hoyer, P., Pei, M., and S. Machani, "Portable Symmetric Key Container (PSKC)", RFC 6030, October 2010. [UT] Wikipedia, "Unix time", February 2011, <http://en.wikipedia.org/wiki/Unix_time>. M'Raihi, et al. Informational [Page 8]


RFC 6238                      HOTPTimeBased                     May 2011


Appendix A. TOTP Algorithm: Reference Implementation

<CODE BEGINS> /** Copyright (c) 2011 IETF Trust and the persons identified as authors of the code. All rights reserved. Redistribution and use in source and binary forms, with or without modification, is permitted pursuant to, and subject to the license terms contained in, the Simplified BSD License set forth in Section 4.c of the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info). */ import java.lang.reflect.UndeclaredThrowableException; import java.security.GeneralSecurityException; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import java.math.BigInteger; import java.util.TimeZone; /** * This is an example implementation of the OATH * TOTP algorithm. * Visit www.openauthentication.org for more information. * * @author Johan Rydell, PortWise, Inc. */ public class TOTP { private TOTP() {} /** * This method uses the JCE to provide the crypto algorithm. * HMAC computes a Hashed Message Authentication Code with the * crypto hash algorithm as a parameter. * * @param crypto: the crypto algorithm (HmacSHA1, HmacSHA256, * HmacSHA512) * @param keyBytes: the bytes to use for the HMAC key * @param text: the message or text to be authenticated */ M'Raihi, et al. Informational [Page 9]


RFC 6238                      HOTPTimeBased                     May 2011


     private static byte[] hmac_sha(String crypto, byte[] keyBytes,
             byte[] text){
         try {
             Mac hmac;
             hmac = Mac.getInstance(crypto);
             SecretKeySpec macKey =
                 new SecretKeySpec(keyBytes, "RAW");
             hmac.init(macKey);
             return hmac.doFinal(text);
         } catch (GeneralSecurityException gse) {
             throw new UndeclaredThrowableException(gse);
         }
     }


     /**
      * This method converts a HEX string to Byte[]
      *
      * @param hex: the HEX string
      *
      * @return: a byte array
      */

     private static byte[] hexStr2Bytes(String hex){
         // Adding one byte to get the right conversion
         // Values starting with "0" can be converted
         byte[] bArray = new BigInteger("10" + hex,16).toByteArray();

         // Copy all the REAL bytes, not the "first"
         byte[] ret = new byte[bArray.length - 1];
         for (int i = 0; i < ret.length; i++)
             ret[i] = bArray[i+1];
         return ret;
     }

     private static final int[] DIGITS_POWER
     // 0 1  2   3    4     5      6       7        8
     = {1,10,100,1000,10000,100000,1000000,10000000,100000000 };













M'Raihi, et al.               Informational                    [Page 10]


RFC 6238                      HOTPTimeBased                     May 2011


     /**
      * This method generates a TOTP value for the given
      * set of parameters.
      *
      * @param key: the shared secret, HEX encoded
      * @param time: a value that reflects a time
      * @param returnDigits: number of digits to return
      *
      * @return: a numeric String in base 10 that includes
      *              {@link truncationDigits} digits
      */

     public static String generateTOTP(String key,
             String time,
             String returnDigits){
         return generateTOTP(key, time, returnDigits, "HmacSHA1");
     }


     /**
      * This method generates a TOTP value for the given
      * set of parameters.
      *
      * @param key: the shared secret, HEX encoded
      * @param time: a value that reflects a time
      * @param returnDigits: number of digits to return
      *
      * @return: a numeric String in base 10 that includes
      *              {@link truncationDigits} digits
      */

     public static String generateTOTP256(String key,
             String time,
             String returnDigits){
         return generateTOTP(key, time, returnDigits, "HmacSHA256");
     }















M'Raihi, et al.               Informational                    [Page 11]


RFC 6238                      HOTPTimeBased                     May 2011


     /**
      * This method generates a TOTP value for the given
      * set of parameters.
      *
      * @param key: the shared secret, HEX encoded
      * @param time: a value that reflects a time
      * @param returnDigits: number of digits to return
      *
      * @return: a numeric String in base 10 that includes
      *              {@link truncationDigits} digits
      */

     public static String generateTOTP512(String key,
             String time,
             String returnDigits){
         return generateTOTP(key, time, returnDigits, "HmacSHA512");
     }


     /**
      * This method generates a TOTP value for the given
      * set of parameters.
      *
      * @param key: the shared secret, HEX encoded
      * @param time: a value that reflects a time
      * @param returnDigits: number of digits to return
      * @param crypto: the crypto function to use
      *
      * @return: a numeric String in base 10 that includes
      *              {@link truncationDigits} digits
      */

     public static String generateTOTP(String key,
             String time,
             String returnDigits,
             String crypto){
         int codeDigits = Integer.decode(returnDigits).intValue();
         String result = null;

         // Using the counter
         // First 8 bytes are for the movingFactor
         // Compliant with base RFC 4226 (HOTP)
         while (time.length() < 16 )
             time = "0" + time;

         // Get the HEX in a Byte[]
         byte[] msg = hexStr2Bytes(time);
         byte[] k = hexStr2Bytes(key);



M'Raihi, et al.               Informational                    [Page 12]


RFC 6238                      HOTPTimeBased                     May 2011


         byte[] hash = hmac_sha(crypto, k, msg);

         // put selected bytes into result int
         int offset = hash[hash.length - 1] & 0xf;

         int binary =
             ((hash[offset] & 0x7f) << 24) |
             ((hash[offset + 1] & 0xff) << 16) |
             ((hash[offset + 2] & 0xff) << 8) |
             (hash[offset + 3] & 0xff);

         int otp = binary % DIGITS_POWER[codeDigits];

         result = Integer.toString(otp);
         while (result.length() < codeDigits) {
             result = "0" + result;
         }
         return result;
     }

     public static void main(String[] args) {
         // Seed for HMAC-SHA1 - 20 bytes
         String seed = "3132333435363738393031323334353637383930";
         // Seed for HMAC-SHA256 - 32 bytes
         String seed32 = "3132333435363738393031323334353637383930" +
         "313233343536373839303132";
         // Seed for HMAC-SHA512 - 64 bytes
         String seed64 = "3132333435363738393031323334353637383930" +
         "3132333435363738393031323334353637383930" +
         "3132333435363738393031323334353637383930" +
         "31323334";
         long T0 = 0;
         long X = 30;
         long testTime[] = {59L, 1111111109L, 1111111111L,
                 1234567890L, 2000000000L, 20000000000L};

         String steps = "0";
         DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         df.setTimeZone(TimeZone.getTimeZone("UTC"));












M'Raihi, et al.               Informational                    [Page 13]


RFC 6238                      HOTPTimeBased                     May 2011


         try {
             System.out.println(
                     "+---------------+-----------------------+" +
             "------------------+--------+--------+");
             System.out.println(
                     "|  Time(sec)    |   Time (UTC format)   " +
             "| Value of T(Hex)  |  TOTP  | Mode   |");
             System.out.println(
                     "+---------------+-----------------------+" +
             "------------------+--------+--------+");

             for (int i=0; i<testTime.length; i++) {
                 long T = (testTime[i] - T0)/X;
                 steps = Long.toHexString(T).toUpperCase();
                 while (steps.length() < 16) steps = "0" + steps;
                 String fmtTime = String.format("%1$-11s", testTime[i]);
                 String utcTime = df.format(new Date(testTime[i]*1000));
                 System.out.print("|  " + fmtTime + "  |  " + utcTime +
                         "  | " + steps + " |");
                 System.out.println(generateTOTP(seed, steps, "8",
                 "HmacSHA1") + "| SHA1   |");
                 System.out.print("|  " + fmtTime + "  |  " + utcTime +
                         "  | " + steps + " |");
                 System.out.println(generateTOTP(seed32, steps, "8",
                 "HmacSHA256") + "| SHA256 |");
                 System.out.print("|  " + fmtTime + "  |  " + utcTime +
                         "  | " + steps + " |");
                 System.out.println(generateTOTP(seed64, steps, "8",
                 "HmacSHA512") + "| SHA512 |");

                 System.out.println(
                         "+---------------+-----------------------+" +
                 "------------------+--------+--------+");
             }
         }catch (final Exception e){
             System.out.println("Error : " + e);
         }
     }
 }

 <CODE ENDS>

Appendix B. Test Vectors

This section provides test values that can be used for the HOTP time- based variant algorithm interoperability test. M'Raihi, et al. Informational [Page 14]


RFC 6238                      HOTPTimeBased                     May 2011


   The test token shared secret uses the ASCII string value
   "12345678901234567890".  With Time Step X = 30, and the Unix epoch as
   the initial value to count time steps, where T0 = 0, the TOTP
   algorithm will display the following values for specified modes and
   timestamps.

  +-------------+--------------+------------------+----------+--------+
  |  Time (sec) |   UTC Time   | Value of T (hex) |   TOTP   |  Mode  |
  +-------------+--------------+------------------+----------+--------+
  |      59     |  1970-01-01  | 0000000000000001 | 94287082 |  SHA1  |
  |             |   00:00:59   |                  |          |        |
  |      59     |  1970-01-01  | 0000000000000001 | 46119246 | SHA256 |
  |             |   00:00:59   |                  |          |        |
  |      59     |  1970-01-01  | 0000000000000001 | 90693936 | SHA512 |
  |             |   00:00:59   |                  |          |        |
  |  1111111109 |  2005-03-18  | 00000000023523EC | 07081804 |  SHA1  |
  |             |   01:58:29   |                  |          |        |
  |  1111111109 |  2005-03-18  | 00000000023523EC | 68084774 | SHA256 |
  |             |   01:58:29   |                  |          |        |
  |  1111111109 |  2005-03-18  | 00000000023523EC | 25091201 | SHA512 |
  |             |   01:58:29   |                  |          |        |
  |  1111111111 |  2005-03-18  | 00000000023523ED | 14050471 |  SHA1  |
  |             |   01:58:31   |                  |          |        |
  |  1111111111 |  2005-03-18  | 00000000023523ED | 67062674 | SHA256 |
  |             |   01:58:31   |                  |          |        |
  |  1111111111 |  2005-03-18  | 00000000023523ED | 99943326 | SHA512 |
  |             |   01:58:31   |                  |          |        |
  |  1234567890 |  2009-02-13  | 000000000273EF07 | 89005924 |  SHA1  |
  |             |   23:31:30   |                  |          |        |
  |  1234567890 |  2009-02-13  | 000000000273EF07 | 91819424 | SHA256 |
  |             |   23:31:30   |                  |          |        |
  |  1234567890 |  2009-02-13  | 000000000273EF07 | 93441116 | SHA512 |
  |             |   23:31:30   |                  |          |        |
  |  2000000000 |  2033-05-18  | 0000000003F940AA | 69279037 |  SHA1  |
  |             |   03:33:20   |                  |          |        |
  |  2000000000 |  2033-05-18  | 0000000003F940AA | 90698825 | SHA256 |
  |             |   03:33:20   |                  |          |        |
  |  2000000000 |  2033-05-18  | 0000000003F940AA | 38618901 | SHA512 |
  |             |   03:33:20   |                  |          |        |
  | 20000000000 |  2603-10-11  | 0000000027BC86AA | 65353130 |  SHA1  |
  |             |   11:33:20   |                  |          |        |
  | 20000000000 |  2603-10-11  | 0000000027BC86AA | 77737706 | SHA256 |
  |             |   11:33:20   |                  |          |        |
  | 20000000000 |  2603-10-11  | 0000000027BC86AA | 47863826 | SHA512 |
  |             |   11:33:20   |                  |          |        |
  +-------------+--------------+------------------+----------+--------+

                            Table 1: TOTP Table



M'Raihi, et al.               Informational                    [Page 15]


RFC 6238                      HOTPTimeBased                     May 2011


Authors' Addresses

   David M'Raihi
   Verisign, Inc.
   685 E. Middlefield Road
   Mountain View, CA  94043
   USA

   EMail: davidietf@gmail.com


   Salah Machani
   Diversinet Corp.
   2225 Sheppard Avenue East, Suite 1801
   Toronto, Ontario  M2J 5C2
   Canada

   EMail: smachani@diversinet.com


   Mingliang Pei
   Symantec
   510 E. Middlefield Road
   Mountain View, CA  94043
   USA

   EMail: Mingliang_Pei@symantec.com


   Johan Rydell
   Portwise, Inc.
   275 Hawthorne Ave., Suite 119
   Palo Alto, CA  94301
   USA

   EMail: johanietf@gmail.com


반응형
728x90

# vsftpd 주요 서비스

/etc/rc.d/init.d/vsftpd start          //FTP서비스 시작
/etc/rc.d/init.d/vsftpd stop          //FTP서비스 종료
/etc/rc.d/init.d/vsftpd restart       //FTP서비스 재시작
/etc/vsftpd/vsftpd.conf               //설정 파일

/sbin/chkconfig vsftpd on           //부팅 시 자동실행

/yum update vsftpd                    //이미 설치가 되어 있으면, vsftpd 업데이트하기

 


# vsftpd 관련 파일

/etc/vsftpd/vsftpd.conf          //vsftpd의 주된 설정파일
/usr/sbin/vsftpd                   //vsftpd의 데몬파일
/etc/initd./vsftpd                  //vsftpd 시작/종료/재시작 스크립트
/etc/pam.d/vsftpd                //vsftpd의 PAM설정
/var/log/vsftpd.log               //vsftpd의 로그파일
/etc/vsftpd.user_list             //FTP 접속을 제한할 사용자 리스트
/etc/vsftpd.ftpusers              //PAM에서 사용하는 FTP 접속제한자 리트스파일


 


# 계정별 vsftpd 접속제한 파일

1. /etc/vsftpd.user_list (or /etc/vsftpd/user_list)
vsftpd에서 기본으로 사용하는 계정별 접속제어 파일이다. 이 파일에 등록된 사용자들은 ftp접속을 거부하게 된다.  
이 파일에 등록할 때에는 다음 3가지 룰을 지켜주면 된다.

  - 가능한 시스템 계정들은 모두 등록한다.
  - 한 행에 한 계정씩만 등록한다.
  - /etc/vfstpd/vsftpd.conf파일(or /etc/vsftpd.conf)에서 
     "userlist_deny=NO"으로 설정되었을 경우에 여기에 등록한 사용자들은 접속을 허용하는 사용자들이며
     "userlist_deny=YES"로 설정하였을 경우에는 접속을 거부하는 사용자리스트가 된다.
     YES가 기본이므로 기본설정을 변경하지 않는다면 이 파일은 접속거부자리스트파일이 된다.


2. /etc/vsftpd.ftpusers (or /etc/vsftpd/ftpusers)
다음은 PAM의 VSFTPD 설정파일로서 /etc/vsftpd/ftpusers 파일에 등록된 사용자들은 접속을 거부하겠다는 의미의 
설정 파일이다. 즉, /etc/vsftpd.ftpusers 파일은 PAM에서 설정하여 사용하고 있는 ftp 접속거부자 리스트 파일이다.

#cat /etc/pam.d/vsftpd
#%PAM-1.0
auth       required     pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
auth       required     pam_stack.so service=system-auth
auth       required     pam_shells.so
account    required     pam_stack.so service=system-auth
session    required     pam_stack.so service=system-auth


 


# /etc/vsftpd/vsftpd.conf 설정옵션

- anonymous_enable=YES (default YES)
  익명(anonymous)접속을 허용할 것인(YES) 허용하지 않을 것인가(NO)를 결정한다.

- anon_root=/var/ftp
  익명(anonymous)접속시 루트디렉토리를 지정한다.

- local_enable=YES (default YES)
  로컬 계정 사용자들의 접속을 허용할 것인가의 여부를 결정한다.
  YES로 설정하면 로컬계정사용자의 접속을 허용하는 것이며 NO로 설정하면 허용하지 않는 것이다.

- write_enable=YES (default YES)
  이 설정은 ftp전용명령어 중에 write명령어를 허용할 것인가를 결정하는 것이다.
  허용하려면 YES, 허용하지 않으려면 NO를 설정한다.

- local_umas=022 (default 022)
  로컬계정 사용자들의 umask값을 설정한다.

- anon_upload_enable=YES (default NO)
  익명(anonymous)계정 사용자에게 파일 어로드를 허용할 것인가(YES) 허용하지 않을 것인가(NO)의 여부를 설정한다.
  가능한 익명계정으로 접속한 사용자에게는 업로드 권한을 허용하지 않는 것이 보안에 좋다.

- anon_mkdir_write_enable=YES (default NO)
  익명(anonymous)계정 사용자에게 디렉토리 생성권한을 허용할 것인가(YES) 허용하지 않을 것인가(NO)의 여부를 설정하는 지시자이다.
  가능한 익명계정으로 접속한 사용자에게는 디렉토리 생성권한을 허용하지 않는 것이 보안에 좋다.

- ftpd_banner=Welcome to blah FTP service.
  ftp서버로 접속할 때에 안내메시지등을 출력하려면 여기서 설정하면 된다.

- dirmessage_enable=YES
  ftp접속한 사용자가 특정 디렉토리로 이동하였을 때 개별 디렉토리의 메시지를 보여주도록 허용할 것인가(YES) 허용하지 안을 것인가(NO)를 설정하다.

- message_file=.message
  ftp접속후에 특정 디렉토리로 이동할 때에 디렉토리 안내메시지 파일로 사용할 파일명을 지정한다.

- xferlog_enable=YES
  ftp접속후에 파일 업로드와 다운로드에 대한 로그를 남길것인가(YES) 남기지 않을 것인가(NO)를 설정한다.

- xferlog_file=/var/log/vsftpd.log
  ftp로그파일의 위치를 결정한다.

- xferlog_std_format=YES
  로그파일에 남길 로그파일의 포맷을 기본포맷으로 남길 것인가(YES) 아닌가(NO)를 설정한다.

- connect_from_port_20=YES
  ftp서비스는 기본적으로 21번 포트와 20번 포트를 사용한다.
  ftp 접속돠 명령어에 사용되는 포트는 21번이며 실제 데이터전송에 사용되는 기본포트는 20번이다.
  이 때 20번 포트의 데이터전송 연결을 허용할 것인가(YES) 허용하지 않을 것인가(NO)를 설정한다.

- session_support=YES
  이 설정이 YES로 설정되어 유효하게 되었을 때에는 바이너리파일인 wtmp에 ftp접속관련기록을 남기게 된다.
  last라는 명령어는 각 사용자들의 접속기록을 wtmp파일에서 가져와 확인하는 명령어이므로 이 설정이 적용되면 last명령어로 ftp접속기록을 확인할 수 있다.

- idle_session_timeout=600
  ftp연결에서 idle타임에 대한 타임아웃값을 설정한다.

- data_connection_timeout=120
  데이터 전송시 적용되는 타임아웃값을 설정한다.

- anon_max_rate=0
  local_max_rate=0
  trans_chunk_size=0
  ftp서비스의 전송속도를 제한하는 설정이다.
  초당 byte수를 지정할 수 있으며 제한없이 허용하려면 0으로 설정한다.
  이 설정은 vsftpd가 독립뎀ㄴ(standalone)모드로 서비스될 때에만 적용되는 것이다.

- max_clients=30
  max_per_ip=3
  이 설정은 동시 ftp접속자수를 제한하는 설정이다.
  max_clients는 ftp접속을 최대 30명까지만 허용하는 설정이다.
  max_per_ip는 한 IP(호스트)에서 동시에 3번까지만 접속이 가능하다는 설정이다.

- ascii_upload_enable=YES
  ascii_download_enable=YES
  기본적으로 ASCII모드로 업로드/다운로드하는 것은 제한되어 있다.
  이 설정으로 ASCII모드로의 업로드/다운로드를 허용하도록 설정할 수 있다.

- deny_email_enable=YES
  banned_email_file=/etc/vsftpd/banned_emails
  익명접속시에 기본적으로 사용되는 계정명을 anonymous이며 패스워드는 email형식으로 입력하면 된다.
  이 때 패스워드로 인정하지 않을 즉, 패스워드로 사용하지 못하도록 할 email 주소를 사용하도록 하는 지시자이다.
  즉, "deny_email_enable=YES"로 설정하시고 "banned_email_file=/etc/vsftpd/banned_emails"로 설정되어 있다면
  패스워드로 허용하지 않을 email 주소를 /etc/vsftpd/banned_emails 파일에 넣어두면 된다.
  그러면 이 파일에 등록된 email주소는 패스워드로 인정하지 않는다.

- chroot_list_enable=YES
  chroot_list_file=/etc/vsftpd/chroot_list
  전체 사용자가 아닌 특정 사용자들에 대하여 자신의 홈디렉토리를 루트디렉토리로 인식하도록 하는 기능으로서 이 기능은 사용자의 홈디렉토리의 상위디렉토리로 벗어나지 못하도록 하는 설정이다.
  먼저 "chroot_list_enable=YES"로 설정하고 /etc/vsftpd/chroot_list 파일에는 이 기능을 적용할 사용자계정명을 등록하면 된다.
  즉, /etc/vsftpd/chroot_list 파일에 등록된 사용자들에 한하여 chroot기능이 적용되어 자기 자신의 홈디렉토리 상위 디렉토리의 이동이 제한된다.

- chroot_local_user=YES
  특정 사용자가 아닌 전체 사용자를 대상으로 chroot()기능을 적용하여 자기 자신의 홈디렉토리 상위 디렉토리로 이동하지 못하도록 하려면 이 설정을 YES로 설정한다.
  만약 "chroot_list_enable=YES" 이고 "chroot_local_user=YES"이면 /etc/vsftpd/chroot_list파일에 등록된 사용자들만 chroot()적용을 받지 않게 된다.
  즉, 이 두 설정이 모두 YES로 되어있다면 /etc/vsftpd/chroot_list에 등록된 사용자들을 제외한 나머지 사용자들만 chroot()가 적용된다.

- ls_recurse_enable=YES
  ftp접속에서는 ls 사용시 -R옵션을 허용하지 않는 것이 기본 설정이다.
  -R옵션이란 서브디렉토리내의 파일들의 리스팅(목록)까지 모두 확인할 수 있도록 하는 것이다.
  이 지시자의 값이 YES로 되어 있다면 ftp접속후에 디렉토리 목록 확인시에 서브디렉토리들의 목록들까지 하넌에 볼 수 있는 -R옵션을 허용하게 된다.

- pam_service_name=vsftpd
  vsftp에서 PAM설정파일명으로 사용할 파일명을 지정한다.

- listen=YES
  listen_port=21
  만약 vsftpd를 xinetd모드가 아닌 독립데몬(standalone)으로 서비스하려면 위의 listen지시자를 YES로 설정하고 listen_port에 서비스할 포트번호(기본 21번)를 지정하면 된다.


출처 : http://oracle.tistory.com/129 (안나푸르나)

반응형
728x90

SFTP는 기본적으로 로그를 남지 않습니다, 때문에 파일의 변경/삭제가 어떻게 된 것인 찾기가 곤란할 수 있습니다.

이번에 소개해 드릴 openssh 및 syslog의 간단한 설정으로 SFTP 작업 로그 남기는 방법에 대해 소개 드립니다.

 

 

1. /etc/ssh/sshd_config 의 편집


아래의 라인을 수정이나 추가해 줍니다.
보통 ‘Subsystem’이 주석 처리되어 있을 것이니 주석을 해제하고 아래와 같이 수정/추가해 주시면 됩니다.

추가할 내용 : Subsystem       sftp    /usr/libexec/openssh/sftp-server -f local2 -l INFO

명령: # echo “Subsystem       sftp    /usr/libexec/openssh/sftp-server -f local2 -l INFO” >> /etc/ssh/sshd_config
          # tail /etc/ssh/sshd_config

sftp88

sftp-server에 대한 자세한 설정 사항은 “man sftp-server” 로 옵션 사항을 참고하세요.

2. syslog.conf 나 rsyslog.con 파일 수정


저는 경우 rsyslog를 사용하여 /etc/rsyslog.conf 에 내용을 추가 했습니다.

추가 내용  : local2.*                                        /var/log/sftp.log

 

명령: # echo “local2.*                                        /var/log/sftp.log” >> /etc/rsyslog.conf
         # tail /etc/rsyslog.conf
sftp77

 

3. 로그 파일 생성 : sftp.log


sftp.log 파일은 syslog나 rsyslog 서비스를 재시작 해주면 자동으로 생성이 된다, 만약 생성이 되지 않았을 경우 다음 명령으로 생성해 줍니다.

 

명령:  # touch /var/log/sftp.log

4. rsyslog, sshd,서비스 재시작


명령 : # /etc/init.d/rsyslog restart 또는 /etc/init.d/syslog restart
          # /etc/init.d/sshd restart

 

 

5. 로그 남김 확인
sftp 테스트 접속 후 로그를 보자

명령 : # tail -f /var/log/sftp.log
sftp99

 

6. 로그로테이트 추가
로그가 기록되는 것이 확인되었다면, 마지막으로 로그로테이트에 sftp.log를 추가하여, 일정 용량 이상일 경우 로그를 백업하도록 하자.
/etc/logrotate.d/syslog 에 “/var/log/sftp.log” 를 추가하자.

sftp66

반응형

+ Recent posts