It was an edgy start from both sides, with both teams managing some possession early on but not creating any real chances.
That changed, however, in the 15th minute when Lucho Gonzales set up Varela to give Porto the lead.
Miguel Veloso tried to get Kiev level in the 21st minute, but his shot was deflected wide for a corner. From that corner Kiev were level, Gusev heading home from Veloso's cross.
Porto continued to push and they were in front again on 36 minutes, Jackson Martinez finishing off a fine pass from James Rodriguez.
Rodriguez could have had a goal of his own in the 53rd minute, but an effort was blocked before he shot wide from the rebound.
Porto were holding on to their lead without being put under any real pressure, but Kiev had their second equaliser in the 72nd minute when Brown Ideye fired home.
They were level for just six minutes this time as Martinez grabbed his second from a pass from Lucho to give Porto the lead for a third time.
This time, there was to be no equaliser for Kiev as Porto took a vital three points in Group A.